主要分支
- master:本地/远程永远分支。用于正式版本发布。该分支上所有节点都包含发布版本tag,可直接编译发布;
- develop:本地/远程永远分支。开发时使用的主要分支,功能迭代的分支;
辅助分支
- feature-
:本地/远程【可选】临时分支。用于某一业务功能开发; - bugfix-
:本地/远程【可选】临时分支。用于BUG修复。需要与release-xxx或hotfix-xxx配合使用; - hotfix-
:本地/远程【可选】临时分支。用于快速修复master分支的BUG。功能类似于release-xxx分支; - release-<version | feature names>:本地/远程临时分支。用于发布正式版本前的测试需求;
原则
- 应该为所有远程分支,创建对应的本地分支;
- 应该所有操作在本地分支进行,最终push到远程分支。即不直接合并至远程分支;
该模型基于《A successful Git branching model》:
优化后模型:
-
任何时刻:只存在一个master/develop分支;
-
同一时刻:可存在多个hotfix/release/bugfix/feature分支;
-
任何分支合入进其他分支,都应保证来源合并是完整/安全(可正确编译)的实现。也就是说,应保证每个合并都具体完整的功能,即未开发完成的功能,不合并至其他分支,如上图中除feature/bugfix节点外,其他分支的节点都具有完整的功能;
-
tag
a) 每次发布(发布至正式/测试环境)时,都应该打tag。
b) 命名规则:
master分支:<版本号>-ga
release分支:<版本号>
- 版本号
命名规则:
va.b.c[.d]
版本号命名规则: va.b.c[.d]
v – 版本号前缀(固定)。version缩写。
a - 大版本号。新增大功能,或大优化时自增。无发布计划的固定为999
b - 中版本号。新增小功能,或小优化时自增。
c - 小版本号。每创建一次hotfix时自增,或提测release一次自增。
d – 仅用于测试版本。使用日期格式yyMMdd。如201006。
- 分支流向:
branch | create from | merge into |
---|---|---|
master | - | - |
develop | master | - |
feature- |
develop | develop/release |
release-<version | feature names> | develop/feature | develop/feature |
hotfix- |
master | master/develop |
bugfix- |
release/hotfix | release/hotfix |
1. master分支
a) 命名规范:master;
b) 本地/远程永久分支。正式版本分支。需保证所有提交都是可交付(可直接编译上线部署)的,且都需打正式版本tag;
c) create from: 无;
d) merge into: 无;
2. develop分支
a) 命名规范:develop;
b) 本地/远程永久分支。为开发的主分支;
c) create from:本地master
;
d) merge into: 无;
2.1 初始化远程develop
# 1) 初始化
git checkout master
git branch --set-upstream-to=origin/master master
git pull
git checkout -b develop master
git push origin develop
# 2)将develop设置为default分支
# 进入git管理后台,将项目默认分支变更为develop
3. feature分支流程
a) 命名规范:feature-
;
a) 本地/远程临时分支;
c) 为每个完整业务功能创建一个feature-本地/远程【可选,当feature模块较小,且不需与其他人并行开发时,可不创建远程】分支;
d) 应保证每次合并到本地develop
的feature具有完整的业务功能;
e) create from:本地develop
;
f) merge into:本地develop
、本地release
;
当feature分支开发完成,但无发布计划时,应该进行以下处理:
- 无发布计划,且无需测试:保留feature(即不合并至develop)
- 无发布计划,且需测试:从feature-a创建release-a-b,并将feature-b合并至release-a-b,测试完成后,保留release-a-b(即不合并至develop/master)
# 1) 初始化
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git checkout -b feature-myfeature develop
git push origin feature-myfeature # 可选
# 2) ... 各种commit
# 2.1) ... commit到本地feature-myfeature)
# 2.2) ... 若存在远程,则commit到远程feature-myfeature(为避免本地代码被误删,或需要多人并行完成feature时,需创建远程feature-myfeature)
3.1 有发布计划
合并至develop。
# 3) 合并至远程develop
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git merge --no-ff feature-myfeature
git push origin develop
# 4) 删除本地/远程feature
git branch -d feature-myfeature
git push origin -d feature-myfeature
3.2 无发布计划,且需提测
参见release章节。
# 3)合并至release
git checkout release-a-b
git branch --set-upstream-to=origin/release-a-b release-a-b
git pull
git merge --no-ff feature-myfeature
git push origin release-a-b --tags
# 4) 删除本地/远程feature
git branch -d feature-myfeature
git push origin -d feature-myfeature
3.3 无发布计划,且无需提测
不合并至任何分支
4. release分支流程
a) 命名规范:
release-<version | feature names> *b) 远程临时分支;* *c) 为每个版本提测创建一个release-<version | feature names>远程分支;* *d) 配合
bugfix-分支使用;* *e) create from:
本地develop或
feature;* *f) merge into:
本地develop、
本地master`;
当feature分支开发完成,但无发布计划时,应该进行以下处理:
- 无发布计划,且无需测试:保留feature(即不合并至develop)
- 无发布计划,且需测试:从feature-a创建release-a-b,并将feature-b合并至release-a-b,测试完成后,保留release-a-b(即不合并至develop/master)
应保证release从develop创建出来后,不再将任何feature合并至develop,以避免污染develop,并且可以保证在完成release测试后,合并至develop时产生更少的冲突。
4.1 有发布计划:从develop创建release
# 1)初始化
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git checkout -b release-v1.1.0 develop
git push origin release-v1.1.0
# 2)...各种bugfix(见bugfix流程)
# 3)打提测tag
# 当bug修复到一定数量,或者到达提测时间节点时,应该重新为release打上提测tag,重新生成可执行文件进行提测。
git checkout release-v1.1.0
git branch --set-upstream-to=origin/release-v1.1.0 release-v1.1.0
git pull
git tag -a v1.1.0.210201
git push origin release-v1.1.0 --tags
# 3) 各种bugfix
# 4)合并至develop
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git merge --no-ff release-v1.1.0
git push origin develop --tags
# 5)合并至master
git checkout master
git branch --set-upstream-to=origin/master master
git pull
git merge --no-ff release-v1.1.0
git tag -a v1.1.0-ga
git push origin master --tags
# 6)删除本地/远程分支
git branch -d release-v1.1.0
git push origin --delete release-v1.1.0
4.2 无发布计划:从feature创建release
# 1)初始化
git checkout -b feature-a origin/feature-a
git checkout feature-a
git checkout -b release-a-b feature-a
git push origin release-a-b
# 1.1) 删除本地/远程feature
git branch -d feature-a
git push origin -d feature-a
# 2)【可选】feature-b合并至release
git checkout release-a-b
git branch --set-upstream-to=origin/release-a-b release-a-b
git pull
git merge --no-ff feature-b
git push origin release-a-b --tags
# 2.1) 删除本地/远程feature
git branch -d feature-b
git push origin -d feature-b
# 3)...各种bugfix(见bugfix流程)
# 4)打提测tag
# 当bug修复到一定数量,或者到达提测时间节点时,应该重新为release打上提测tag,重新生成可执行文件进行提测。
git checkout release-a-b
git branch --set-upstream-to=origin/release-a-b release-a-b
git pull
git tag -a v999.0.0.21019
git push origin release-a-b --tags
# 5)【可选,当需要发布时】合并至develop
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git merge --no-ff release-a-b
git push origin develop --tags
# 6)【可选,当需要发布时】合并至master
git checkout master
git branch --set-upstream-to=origin/master master
git pull
git merge --no-ff release-a-b
git tag -a v1.2.0-ga
git push origin master --tags
# 7)【可选,当需要发布时】删除本地/远程分支
git branch -d release-a-b
git push origin --delete release-a-b
5. bugfix分支流程
a) 命名规范:
bugfix-<feature name> *b) 本地/远程临时分支;* *c) bugfix分支为与feature类似。区别在于feature对应于develop分支,用于常规功能开发。而bugfix对应于release/hotfix分支,用于bug修复;* *d) 为每个完整bug修复创建一个bugfix-<feature name>本地/远程【可选,当feature模块较小,且不需与其他人并行开发时,可不创建远程】分支;* *e) create from:
本地release-<version | feature names>、
本地hotfix-;* *f) merge into:
本地release-<version | feature names>或
本地hotfix-`;
# 1)初始化
git checkout release-v1.1.0
git branch --set-upstream-to=origin/release-v1.1.0 release-v1.1.0
git pull
git checkout -b bugfix-mybugfix release-v1.1.0
git push origin bugfix-mybugfix # 可选
# 2)...各种commit
# 2.1) ... commit到本地bugfix-mybugfix)
# 2.2) ... 若存在远程,则commit到远程bugfix-mybugfix(为避免本地代码被误删,或需要多人并行完成bugfix时,需创建远程bugfix-mybugfix)
# 3)合并至远程release
git checkout release-v1.1.0
git branch --set-upstream-to=origin/release-v1.1.0 release-v1.1.0
git pull
git merge --no-ff bugfix-mybugfix
git push origin release-v1.1.0
# 5)删除本地/远程分支
git branch -d bugfix-mybugfix
git push origin -d bugfix-mybugfix # 可选
6. hotfix分支流程
a) 命名规范:
hotfix-<version> *b) 远程临时分支;* *c) 用于快速修复master分支的BUG。功能类似于
release-分支。唯一区别是
release-从
develop创建,而
hotfix-从
master创建;* *d) 配合
bugfix-分支使用;* *e) create from:
本地master;* *f) merge into:
本地develop、
本地master`;
# 1)初始化
git checkout master
git branch --set-upstream-to=origin/master master
git pull master
git checkout -b hotfix-v1.0.1 master
git push origin hotfix-v1.0.1
# 2)...各种bugfix(见bugfix流程)
# 3)打提测tag【可选】
# 当需要提交测试部门进行测试时,应该为该节点打上提测tag;
# 若需要涉及bugfix-xxx流程,则BUG修复到一定程度,或者到达提测时间节点时,应该重新为打上提测tag进行提测。
git checkout hotfix-v1.0.1
git branch --set-upstream-to=origin/hotfix-v1.0.0 hotfix-v1.0.1
git pull
git tag -a v1.0.1.210101
git push origin hotfix-v1.0.1 --tags
# 4)合并至develop
git checkout develop
git branch --set-upstream-to=origin/develop develop
git pull
git merge --no-ff hotfix-v1.0.1
git push origin develop --tags
# 5)合并至master
git checkout master
git branch --set-upstream-to=origin/master master
git pull
git merge --no-ff hotfix-v1.0.1
git tag -a v1.0.1-ga
git push origin master --tags
# 6)删除本地/远程分支
git branch -d hotfix-v1.0.1
git push origin --delete hotfix-v1.0.1