Git进阶系列 | 2. Git中的分支策略

news2024/7/2 4:16:16

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是第2篇。原文:Branching Strategies in Git[1]

几乎所有的版本控制系统(VCS)都有某种类型的分支支持。简而言之,分支意味着可以创建一个新的、独立的容器而离开主开发线,并继续在那里工作。通过这种方式,可以在不破坏生产代码库的情况下进行试验和尝试。Git用户知道Git的分支模型非常特殊,而且非常强大,这是Git最酷的功能之一。Git的分支模型快速且轻量,在分支之间来回切换的速度与创建或删除分支一样快。可以说Git鼓励使用大量分支和合并的工作流。

Git把创建多少分支以及合并的频率完全交给了开发者决定。如果你独自编写代码,可以自由选择什么时候创建新分支,以及保留多少个分支。但当我们在团队中工作时,情况就不同了。Git提供工具,但是团队需要负责以最佳方式使用这一工具!

本文将讨论分支策略和不同类型的Git分支,还会介绍两种常见的分支工作流: Git Flow和GitHub Flow。

Git进阶系列:

  1. 创建完美的提交
  2. Git中的分支策略(本文)
  3. 基于Pull Request实现更好的协作
  4. 合并冲突
  5. Rebase vs Merge
  6. 交互式Rebase
  7. Git中的Cherry-pick提交
  8. 用Reflog恢复丢失的提交

团队合作: 制定规则

在探索构建发布和集成变更的不同方法之前,先来讨论一下规则。如果在团队中工作,需要对项目的通用工作流和分支策略达成一致,最好将其写下来,让所有团队成员都能看到。

诚然,并不是每个人都喜欢编写文档或指导方针,但将最佳实践记录在案不仅可以避免错误和冲突,还有助于培训新团队成员。解释分支策略的文档将帮助他们理解团队是如何工作的,以及如何处理软件版本。

以下是我们自己文档中的一些例子:

  • master代表当前的公开发布分支
  • next表示下一个公开发布分支(这样我们就可以在master上提交修补程序而不会引入不必要的更改)
  • 特性分支被分组在 feature/
  • WIP分支被分组在 wip/下(可以用来创建个人WIP的“备份”)

不同团队可能对这些规则有不同看法(例如“wip”或“feature”组),这肯定会反映在他们自己的文档中。

集成变更和结构化发布

当我们考虑如何在Git仓库中使用分支时,应该从考虑如何集成变更和如何构建发布开始。所有这些话题都是紧密相连的,为了更好的理解不同的选择,我们来看下两种不同的策略。下面的例子是为了说明极端情况会怎么样,从而帮助你思考如何设计自己的分支工作流:

  • 主线开发
  • 状态分支、发布分支和特性分支

第一个选择可以被描述为“始终集成”,基本上可以归结为: 始终将自己的工作与团队的工作集成在一起。在第二种策略中,收集自己的工作并发布,即多个不同类型的分支进入预发阶段。两种方法各有利弊,两种策略都适用于某些团队,但不适用于另一些团队,大多数开发团队在这两个极端之间工作。

我们从主线开发开始解释这个策略是如何工作的。

主线开发

之前提到过,这种方法的座右铭是“总是集成”。只有一个单独的分支,每个人都在主线上开发:

alt

记住,这是一个简化的例子,我怀疑在现实世界中是否有任何团队能够使用如此简单的分支结构。然而,理解这个模型的优点和缺点确实有帮助。

首先,只有一个分支,因此很容易跟踪项目中的变化。其次,提交必须相对较小: 在不断集成到生产代码的环境中,不能冒险进行大而臃肿的提交。因此,团队的测试和QA标准必须是一流的!如果没有一个高质量的测试环境,主线开发方法就不适合。

状态分支、发布分支和特性分支

下面看看另一种情况,如何使用多个不同类型的分支。每个分支都有不同的工作: 新特性和实验代码保存在自己的分支中,发布可以在自己的分支中规划和管理,甚至开发流程中的各种状态也可以用分支来表示:

alt

记住,这完全取决于团队和项目的需求。虽然这种方法一开始可能看起来很复杂,但完全是一个练习和习惯的问题。

现在,让我们更详细地探讨两种主要的分支类型: 长期分支(long-running branches)和短期分支(short-lived branches)。

长期分支

每个Git仓库至少包含一个长期分支,通常称为mastermain。当然,团队可能会决定在项目中使用其他长期分支,例如类似于开发(develop)、生产(production)或预发(staging)分支。所有这些分支都有一个共同点: 存在于整个项目生命周期中。

alt

mastermain这样的主线分支是长期分支的一个例子。此外,还有所谓的集成分支,如开发或预发。这些分支通常代表项目发布或部署过程中的状态。如果代码在开发生命周期中经历了不同的状态(例如,从开发阶段到预发阶段再到生产阶段),在分支中的这个镜像结构也是有意义的。

关于长期分支的最后一点: 大多数团队都有一个类似于“不要直接向长期分支提交内容”的规则,通常通过merge或rebase来集成。制定这项规则有两个主要原因:

  • 质量: 不应将未经测试或评审的代码发布到生产环境中。
  • 捆绑发布和调度: 可能希望分批发布新代码,甚至提前安排发布。

接下来是短期分支,通常为特定目的而创建,然后在代码集成后删除。

短期分支

与长期分支相反,短期分支是为临时目的而创建的,一旦它们完成了职责并且代码被集成到主线(或另一个长期分支)中,就会被删除。有许多不同的原因需要创建短期分支,例如致力于新的实验性特性,修复bug,重构代码,等等。

短期分支通常基于长期分支创建。假设我们开始有一个新特性的开发,可以基于长期的主分支创建新特性分支。在若干次提交和测试之后,工作完成,新特性可以集成到主分支中,并且merge或rebase之后,可以删除特性分支。

alt

两种流行的分支策略

最后我们看一下两种流行的分支策略: Git Flow和GitHub Flow。虽然不同的团队可能会决定完全不同的分支策略,但这两种流行的策略可以作为团队分支策略的灵感来源。

Git Flow

Git Flow[2]是一个著名的分支策略,其中main分支总是反映当前的生产状态,此外还有第二个长期分支,通常称为develop。所有特性分支都从这里创建,并将合并到develop中。而且,该分支是新发布的起点: 开发人员创建一个新的release分支,在上面工作、测试、提交bug修复。一旦一切正常,并且确信已经准备好投入生产,就将它合并回main。作为最后一步,在main上为发布添加一个标签,并删除release分支。

alt

Git Flow对于可打包的软件(桌面)应用程序或库来说工作得很好,但对于网站项目来说似乎有点过头了。在这类项目里,main分支和release分支之间通常区别不大,分不同的分支没有特别大的好处。

如果使用的是像Tower这样的Git桌面GUI,可以在界面中找到可能的操作,不需要记住任何新命令:

alt
GitHub Flow

如果团队遵循短生产周期和频繁发布的持续交付方式,建议看看GitHub Flow[3]

这种方式非常精益和简单: 有一个长期分支,即默认的main分支,任何正在做的工作都有自己独立的分支,无所谓是新特性、bug修复还是重构。

alt

“最好”的Git分支策略是什么?

如果问10个不同的团队他们是如何使用Git分支的,可能会得到10个不同的答案。没有所谓的“最佳”分支策略,也没有每个人都应该采用的完美工作流。为了找到最适合团队的模型,应该坐下来分析所做的项目,讨论发布策略,然后决定一个分支工作流,从而以最好的方式支持我们的项目。

如果想更深入了解高级Git工具,可以免费查看“Advanced Git Kit[3]”: 这是关于分支策略、交互式Rebase、Reflog、子模块等主题的短视频集合。

References:
[1] Branching Strategies in Git: https://css-tricks.com/branching-strategies-in-git/
[2] A Successful Git Branching Model: http://nvie.com/posts/a-successful-git-branching-model/
[3] GitHub Flow: https://guides.github.com/introduction/flow/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开发细节】SpringBoot项目将接口从HTTP换为HTTPS

证书准备 首先需要生成一个 SSL 证书,可以使用 OpenSSL 工具或者自己的 CA 颁发机构来生成证书,这里就不赘述了。如果是测试阶段,也可以使用 self-signed certificate。 直接使用jdk的keytool生成,具体操作方法如下: …

一个好看美观的登录注册界面的实现

序言&#xff1a;之前介绍那个博客&#xff0c;然后自己搞了这个界面。最近有人和我要&#xff0c;把代码给大家贴出来&#xff0c;提供参考。 首先是这个界面哈 <!DOCTYPE html> <html lang"en"> <head><script src"../static/lib/jquer…

不走弯路!记一个Appium框架运行的实例

目录 前言&#xff1a; 一、框架环境安装 二、测试流程操作 1、安装APK 2、启动 3、服务参数配置 4、脚本录制操作 5、脚本编写 6、脚本执行 三、测试总结 前言&#xff1a; Appium是一个开源的自动化测试框架&#xff0c;用于移动应用程序的自动化测试。它支持在iOS和Andro…

python:使用Scikit-image库的slic函数分割遥感图像

作者:CSDN @ _养乐多_ 本文记录了使用Scikit-image库的skimage.segmentation模块中的slic函数,进行超像素分割的代码。 文章目录 一、slic函数详解二、代码一、slic函数详解 在Scikit-image库的skimage.segmentation模块中,slic函数用于进行超像素分割。该函数的参数含义如…

62、基于51单片机手机APP蓝牙调试助手控制四个LED灯的开关系统设计(程序+原理图+PCB源文件+Proteus仿真+外文文献翻译+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元…

CRM选型之CRM系统要不要自研

如今在外部激烈的竞争环境下&#xff0c;CRM因其具有有效管理客户资源&#xff0c;提升客户体验和满意度的能力&#xff0c;而逐渐成为了企业在运营中必不可收的一部分。然而&#xff0c;在引入CRM系统时&#xff0c;企业面临着选型难题&#xff1a;是自研还是购买第三方的CRM系…

Qt利用paintEvent绘制双Y轴坐标折线图

在项目中&#xff0c;根据需求需要开发双Y轴坐标折线图&#xff0c;但是由于它有多个图层&#xff0c;如果使用QChart绘制的话&#xff0c;达不到需求的要求&#xff0c;只能自己绘制&#xff0c;具体的利用translate()接口将坐标系统移动到界面的左下角(30, height() - 50)处&…

IDEA启动终端报错: Cannot open Local Terminal Failed to start ***

1.问题 打开IDEA后&#xff0c;启动终端发现终端报错没有办法正常使用&#xff0c;错误提示 Cannot open Local Terminal Failed to start [powershell.exe] in D:\vue_admin Error running process: CreateProcess failed. Code 2 See IDE log (Help | Show Log in Explorer…

开源创新,燃起未来的火花

尊敬的各位嘉宾、领导、专家、企业代表、优秀开发者和创新人才们&#xff1a; 在2023年6月11日至13日&#xff0c;开放原子全球开源峰会盛大召开&#xff0c;汇集了众多业界精英和开源领域的专家学者&#xff0c;为探索开源创新的辉煌未来共同助力。作为一名开源技术爱好者&am…

开放式耳机的优缺点有哪些?目前有什么开放式耳机推荐?

什么是开放式耳机&#xff1f; 从名字上理解就是开放样式的耳机&#xff0c;其实也确实如此&#xff0c;开放式耳机是不需要封闭耳道来传输声音&#xff0c;主要是通过耳骨振动传递或者声波震动耳膜&#xff0c;两者声音传递的方式都不用完全封闭耳道&#xff0c;可以让耳道对…

COMSOL导入图片几何模型-以二维多孔介质为例

建模教程 首先获取一张多孔介质图片&#xff0c;这里就以COMSOL官网教程图片为例 通过软件将png格式的图片转换为DXF格式文件&#xff0c;也就是AutoCAD支持的文件&#xff1a; 下一步打开COMSOL软件建立二维模型&#xff0c;导入事先准备好的dxf模型&#xff0c;需要注意导入…

C++中String的语法及常用接口的底层实现详解

在C语言中&#xff0c;我们知道处理字符串所用的类型是 char []或者char* 。字符串是以‘\0’结尾的。在C中&#xff0c;string 是一个标准库类&#xff08;class&#xff09;&#xff0c;用于处理字符串。它提供了一种更高级、更便捷的字符串操作方式&#xff0c;string 类提供…

mysql 开启binlog

1&#xff09;检查binlog功能是否有开启 mysql> show variables like log_bin; ---------------------- | Variable_name | Value | ---------------------- | log_bin | OFF | ---------------------- 1 row in set (0.00 sec) &#xff08;2&#xff09;如果显…

用视频制作gif动画的小窍门!知识分享

Gif动画图片是当下最为流行的一种图片格式&#xff0c;它的内容丰富画面生动&#xff0c;能够快速抓住人们的眼球。有非常好信息传递效果&#xff0c;但是很多小伙伴不知道这种gif动画怎么制作的。别担心&#xff0c;接下来小编就跟大家分享一下利用视频制作gif动画的小窍门&am…

Docker Compose资源限制

一、资源限制原因&#xff1a; 防止容器占用过多资源,影响其他容器或宿主机保证容器稳定运行,避免OOM等情况.OOM现象&#xff1a;根据优先机制kill掉宿主机上最高的进程从而来释放空间&#xff0c;只要是宿主机的进程都可能被kill掉的。进行资源隔离,提高安全性 二、Docker Com…

eclipse (C/C++) 常用设置记录

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台&#xff1b;现公司用其作为开发单片机的IDE&#xff1b;因此记录一下常用的配置方法&#xff1b; 文章目录 零、常用默认快捷键一、高亮相同变量二、修改高亮变量颜色三、在整个工程内搜索某个函数四、切换主题五、改变字…

主分区,逻辑分区,扩展分区有什么区别

1.地位不同 逻辑分区属于扩展分区&#xff0c;扩展分区属于主分区。 给新硬盘上建立分区时都要遵循以下的顺序&#xff1a;建立主分区→建立扩展分区→建立逻辑分区→激活主分区→格式化所有分区。 2.位置不同 主分区又叫做引导分区&#xff0c;最多只能创建四个。 扩展分…

软考A计划-系统集成项目管理工程师-信息化知识(四)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

人机接口回路原理(一)

一、人机接口框图 一般来说&#xff0c;微机保护的人机接口回路是指键盘、显示器及接口 CPU插件电路。人机接口回路的主要作用是通过键盘和显示器完成人机对话任务、时钟校对及与各保护CPU插件通信和巡检任务。在单CPU结构的保护中&#xff0c;接口 CPU就由保护CPU兼任。为了减…

什么是IO Pad?

1.什么是IO pad&#xff1f; IO pad是一个芯片管脚处理模块&#xff0c;即可以将芯片管脚的信号经过处理送给芯片内部&#xff0c;又可以将芯片内部输出的信号经过处理送到芯片管脚。输入信号处理包含时钟信号&#xff0c;复位信号等&#xff0c;输出信号包含观察时钟、中断等…