1. 前言
推荐一种行之有效的Git分支管理,方便团队炼丹。
2. The main branches
main branches是指在项目中的主分支,通常有两条:master 和 develop。这两个主分支的存在于项目的整个声明周期,即创建之后不会被删除。

2.1 master
master:主分支,是最稳定的分支,此分支表示项目处于可发布状态。
2.2 develop
develop :开发分支,平行于主分支。此分支表示下一个版本最新交付的开发变更的状态。
备注:
当develop分支中的源代码达到一个稳定点并准备发布时,所有的变更都应该合并到master中,然后用发布号进行标记(Tag)。因此,每次当develop合并到master时,这就表示一个新的版本处于可发布状态。
3. Supporting branches
除了主分支master和develop,本方法还使用各种supporting branches来帮助团队成员进行并行开发,简化特性跟踪,为生产版本做准备,并帮助快速修复生产问题。与main branches不同的是这些分支的生命周期总是有限的,因为它们最终会被删除。
supporting branches包括如下几种:
- Feature branches
- Release branches
- Hotfix branches
每个分支都有一个特定的目的,并且受到严格的规则约束,这些规则规定哪些分支可能是它们的原始分支,哪些分支必须是它们的合并目标。
3.1 Feature branches
feature branches(有时也称为topic branches)用于为即将发布的或遥远的未来版本开发新功能。feature branches的本质是,只要feature还在开发中,它就会一直存在,但最终会被合并回develop(明确地将新feature添加到即将发布的版本中)或被丢弃(万一实验结果令人失望)。
feature branches有一下特性:
- 来自于
develop brance; - 最终必须
merge到develop branch;
如下图所示:

备注:feature branches只存在于开发者的repo中。
3.1.1 创建
当开始开发一个新功能时,从develop branch分支出来一个新的feature branch分支myfeature。
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"
3.1.2 合并
已经完成的功能可能会被合并到develop branch中,为加入到即将发布的版本中做准备。
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
注: 参数--no-ff指定Git以no fast-forward的方式进行合并,这种方式可以避免丢失feature branches历史存在的信息。no fast-forward将提交对象保存在支线,然后在主线新建一个提交对象,修改HEAD指针及新建提交对象的指针,而且此新建提交对象有两个父提交对象(即有两个parent指针);fast-forward是直接在主线(合并主分支)上,添加这些提交对象,即直接移动HEAD指针。这两种方法合并后分支指向不同:快速推进合并后,两个分支将同时指向最新提交对象,而非快速推进合并后,合并主分支指向新建的提交对象,另一分支指向不变。如下图所示:

在后一种情况下,不可能从Git历史中看到哪些提交对象一起实现了某个feature——除非人工读取所有日志消息。
3.2 Release branches
该分支用来发布新版本。此分支可以做非常小的Bug修复,也可以规定禁止在此类型分支上做任何Bug修复,只用来做版本发布的相关工作。
release branches有一下特性:
- 从
develop branch分支创建; - 完成后合并到
develop和master分支;
从develop分支出一个新release分支的关键时刻是当develop(几乎)反映了新发布的期望状态时。至少所有针对即将构建的版本的特性都必须在这个时间点被合并到develop中。分配发布版本的版本号正是在release分支开始的时候。
3.2.1 创建
release branches从develop branch创建。
$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)
这个新的分支可能会在那里存在一段时间,直到这个版本明确地推出为止。在此期间,小的bug修复可以应用于这个分支(而不是开发分支)。但是大型新功能严禁在这里添加,如果有,它们必须被合并到develop中,并且要等到下一个重要的发布。
3.2.2 合并
当release branches的状态准备好成为真正的发布版本时,需要执行以下操作。
- 首先,发布分支被合并到master中(因为根据定义,每个master上的提交都是一个新的发布版本);
- 接下来,必须在master上标记提交(
tag),以便将来引用这个历史版本; - 最后,在
release branches上所做的更改需要被合并回develop branch中,以便将来的发布也包含这些错误修复。
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).
3.3 Hotfix branches
hotfix branches是为了修复特别紧急的生产版本Bug。当必须立即解决产品版本中的严重错误时,可以从标记产品版本的master branch的相应标记中分支一个hotfix branch。
hotfix branches有一些特性:
- 从
master branch创建; - 完成后合并到
develop和master分支;

3.3.1 创建
从master branch创建hotfix branches。
$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)
$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)
3.3.2 合并
Bug修复完成之后要合并到develop branch和master branch。
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).
注: 当release branches存在时,hotfix更改需要合并到该release branch中,而不是develop branch。当release branch分支完成时,再将该release branch合并到develop branch中。
4. 总结
以上内容总结如下图:

本文介绍了一种Git分支管理策略,包括master和develop主分支的作用,以及Feature、Release和Hotfix分支的具体使用方法,有助于团队协作和版本控制。
1181

被折叠的 条评论
为什么被折叠?



