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. 总结
以上内容总结如下图: