Post

Git 分支模型规范

本分支模型主要参考了[ Vincent Driessen 博文 ](https://nvie.com/posts/a-successful-git-branching-model/).

Git 分支模型规范

分支模型总览

分支模型

主分支

中心仓库保有两条拥有永久生命周期的主分支:

  • main
  • develop

主分支

两条主分支并行存在于整个项目周期,

  • main 分支反映了项目产品稳定版本的变化状态.
  • develop 分支则是反映了各个 release 版本的开发变化. 所以 develop 分支也称为”整合分支”, 与辅助分支交互合并, 记录开发过程. 其中当 develop 分支到达了一个稳定的版本时, 就会合并回 main 分支, 同时打上 release 编码, 也就是对应的内部版本号.

辅助分支

feature 分支

  • 功能分支一般创建来自于 develop 分支,
  • 完成开发后必须合并回 develop 分支.
  • 分支命名除了 main, develop, release-, 或 hotfix- 以外都是可以的, 尽量采用与所开发功能对应的英文单词, 尽量不用缩写.

功能分支

从 develop 分支创建功能分支:

1
2
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"

完成开发, 以及必要的测试后, 合并回 develop 分支, 并删除功能分支:

1
2
3
4
5
6
7
8
$ 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

PS: 功能分支内的历史一般不合并到develop分支中, 所以基本都要带上 --no-ff flag 来省去, 具体功能见下图.
no-ff-merge

Release 分支

  • 功能分支一般创建来自于 develop 分支,
  • 合并回 develop 和 main 分支.
  • 分支命名采用 release-*, * 为对应的 release 编码, 也就是内部版本号.

release 分支

从 develop 分支创建 release 分支:

1
2
3
4
5
6
7
$ 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(-)

PS: 这里的 bump-version.sh 是修改对应版本信息文件的脚本.

合并到 main 分支, 并打上版本信息 tag :

1
2
3
4
5
6
$ git checkout main
Switched to branch 'main'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

合并到 develop 分支:

1
2
3
4
5
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

如果该 release 没必要存在, 则进行删除:

1
2
$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).

Hotfix 分支

hotfix 分支用于修复上线产品比较严重的bug.

  • hotfix 分支一般创建来自于 main 分支,
  • 合并回 develop 和 main 分支.
  • 分支命名采用 hotfix-*, * 为对应的内部版本号.

hotfix 分支

从 main 分支创建 hotfix 分支:

1
2
3
4
5
6
7
$ git checkout -b hotfix-1.2.1 main
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(-)

问题修复后进行提交:

1
2
3
$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)

合并到 main 分支, 并打上版本信息 tag :

1
2
3
4
5
6
$ git checkout main
Switched to branch 'main'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1

合并到 develop 分支:

1
2
3
4
5
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)

删除 hotfix 分支:

1
2
$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

额外分支

本项目的仓库会有两个长期的额外分支:

  • demo: 用于维护项目相关模块开发预研的程序demo
  • doc: 用于维护项目相关的文档,可用于展示项目使用在pages上

demo 分支规范:

  • 一次提交只能提交某一个demo的相关内容
  • demo之间尽量保持独立性互不依赖
  • 如有必要demo下的添加README文档对demo进行简单介绍
  • 所有demo必须要放在demos文件夹内

doc 分支规范:

  • 一次提交只能提交某一个文档的相关内容
  • 添加系列文档可以新建文件夹,并在该文件夹下添加README文件介绍该系列文档的内容,以及其下各个文档简短说明及文件链接
  • 所有文档必须要放在doc文件夹内
This post is licensed under CC BY 4.0 by the author.