主要分支

  • 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: 本地developfeature;* *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