Git Flow 教程

欢迎你来读这篇博客,这篇博客主要是关于Git Flow的知识分享。
其中包括了关于我的简介和收集的知识分享。

前置知识

技术背景

为学不实,无可据之地。

  • 建议了解Git的基本使用
  • 有Git使用经验更佳
  • 对GitFlow的组织和规范较为感兴趣

前置资料

Git - 官方文档

Git - 简明指南

Git 教程

缺失的一课 - 版本控制Git

Git Cheatsheet

Git

常用命令

GitLab 私服搭建

GitFlow

Git 管理模型

  • Git Flow
    特点:适合大型长期项目、五大分支、复杂繁琐、分工明确协同前进
  • GitHub Flow
    简化的Git Flow
  • GitLab Flow
    介于 GitFlow 和 GitHubFlow 之间
  • Forking Work Flow
    分布式开发,注重Merge,开源居多
  • Trunk-Base Development
    单一共享分支,共享主干,小步快跑

GitFlow介绍

GitFlow 是一种基于 Git 版本控制系统的工作流程模型,旨在管理软件开发过程中的分支管理和版本发布。它是由 Vincent Driessen 在
2010 年提出的,并得到了广泛应用。

GitFlow 的核心概念是将软件开发过程划分为两个主要分支:master 分支和 develop 分支。master 分支用于存储稳定的、可发布的代码版本,而
develop 分支则用于集成新功能和修复 bug 的开发。除了这两个主要分支外,GitFlow 还定义了一些辅助分支,用于处理功能开发、bug
修复和发布等任务。

GitFlow 的优点包括清晰的分支管理、严格的代码版本控制、适应长期和大规模开发项目等。它提供了一种结构化的工作流程,使团队成员能够更好地协作和管理软件开发过程。

分支命名规范

git分支命名规范:

  • 主分支 master(发布正式使用的都是这个分支)

  • 发布分支 release/版本号(通常是我们需要发布的版本,起名最好跟版本号走)

  • 预生产分支 pre (测试完毕后,还是会在预发环境下面再次 check 一面,才会上生产)

  • 开发分支 dev(所有功能分支在开发的时候需要验证,除了在本地验证,还可以合入 dev 发布验证)

  • 测试分支 test(所有的功能分支开发完成后会合入 test发布,就是我们所说的提测)

  • 功能分支 feature/版本号(通常是我们需要开发的需求,起名最好跟版本号走)

  • 修复分支 hotfix/bug号(通常是生产上出现了一些问题,需要紧急修复,起名最好按照 bug 号)

你可以参考这个

git-flow-img

实践技巧

GitFlow实践 TODO

MR规范

不知道你是否还是在工作或者平常coding当中还是在 git commit -m 'some message',或者是直接不写message的形式提交你变更的代码呢?
我只能说这样的方式真的是很不友好,而且很low~

格式化的Commit message,有几个好处。

  • 提供更多的历史信息,方便快速浏览。
  • 可以过滤某些commit(比如文档改动),便于快速查找信息。
  • 可以直接从commit生成Change log。

那么如何能优雅而又不失体面的提交你的代码呢?其实我们的 git commit message 是应该具备一些规范的。
目前社区有很多规范,你可以查看mr规范了解更多。
当前用的比较多的是 Angular
团队的规范

Commit message 的格式

每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。

1
2
3
4
5
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

其中,Header 是必需的,Body 和 Footer 可以省略。

不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。

Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。

  • type

type用于说明 commit 的类别,只允许使用下面7个标识。

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

如果typefeatfix,则该 commit 将肯定出现在 Change log 之中。其他情况(docschorestylerefactortest
)由你决定,要不要放入 Change log,建议是不要。

  • scope

scope 用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

  • subject

subjectcommit 目的的简短描述,不超过50个字符。

  • 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
  • 第一个字母小写
  • 结尾不加句号(.)

下面是一个范例。

1
<feat>(<blog os>):<double faults>

Body

Body 部分是对本次 commit 的详细描述,可以分成多行。下面是一个范例。

1
2
3
4
5
6
7
8
9
10
11
12
blog os kernel double faults
  - trigger double faults
  - switch stacks
    - create tss
    - create gdt
    - reload code segment register
    - load tss
    - update idt entry
  - stack overflow test case
    - test idt
    - impl _start
    - double fault handler

有两个注意点。

  • 使用第一人称现在时,比如使用change而不是changed或changes。

  • 应该说明代码变动的动机,以及与以前行为的对比。

Footer 部分只用于两种情况

  • 不兼容变动

如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BREAKING CHANGE: isolate scope bindings definition has changed.

To migrate the code follow the example below:

Before:

scope: {
myAttr: 'attribute',
}

After:

scope: {
myAttr: '@',
}

The removed `inject` wasn't generaly useful for directives so there should be no code using it.
  • 关闭 Issue
1
2
3
4
% 如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。
Closes #234
# 也可以一次关闭多个 issue 。
Closes #123, #245, #992

Revert

还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以revert:开头,后面跟着被撤销 Commit 的 Header。

1
2
3
revert: feat(pencil): add 'graphiteWidth' option

This reverts commit 667ecc1654a317a13331b17617d973392f415f02.

Body部分的格式是固定的,必须写成This reverts commit <hash>.,其中的hash是被撤销 commit 的 SHA 标识符

如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。
如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts小标题下面。

Git Commit 模版

如果你只是想要尝试一下,你可以给 git 设置 commit template 在每次 git commit 的时候在 vim 中显示,用来提示自己。

修改 ~/.gitconfig 添加

1
2
[commit]
template = ~./gitmessage

新建 ~/.gitmessage 内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
# head: <type>(<scope>): <subject>
# - type: feat, fix, docs, style, refactor, test, chore
# - scope: can be empty (eg. if the change is a global or difficult to assign to a single component)
# - subject: start with verb (such as 'change'), 50-character line
#
# body: 72-character wrapped. This should answer:
# * Why was this change necessary?
# * How does it address the problem?
# * Are there any side effects?
#
# footer:
# - Include a link to the ticket, if any.
# - BREAKING CHANGE

工具推荐

Commitizen

工具级 commit message 生成,commitizen提供的 git cz 来替代我们的 git commit
命令生成符合规范的 commit message 信息。

还需要为 commitizen 指定一个 Adapter
比如:Angular团队的cz-conventional-changelog使它能够按照我们指定的规范生成
commit message 信息

  • 全局安装
1
2
3
4
5
6
7
# 安装
yarn global add commitizen cz-conventional-changelog
# or
npm install -g commitizen cz-conventional-changelog
# 全局模式下,需要~/.czrc 配置文件 为 commitizen 指定 Adapter
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
# 直接在对应的项目里面 git cz 就可以
  • 项目级安装
1
2
3
4
# 安装
yarn add -D commitizen cz-conventional-changelog
# or
npm install -D commitizen cz-conventional-changelog

package.json 配置

1
2
3
4
5
6
7
8
9
"script": {
...,
"commit": "git-cz",
},
"config": {
"commitizen": {
"path": "node_modules/cz-conventional-changelog"
}
}

然后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。

1
commitizen init cz-conventional-changelog --save --save-exact

以后,凡是用到git commit命令,一律改为使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。

validate-commit-msg

validate-commit-msg 用于检查 Node 项目的
Commit message 是否符合格式。

它的安装是手动的。首先,拷贝下面这个JS文件,放入你的代码库。文件名可以取为validate-commit-msg.js。

接着,把这个脚本加入 Git 的 hook。下面是在package.json里面使用 ghooks,把这个脚本加为commit-msg时运行。

1
2
3
4
5
"config": {
"ghooks": {
"commit-msg": "./validate-commit-msg.js"
}
}

然后,每次git commit的时候,这个脚本就会自动检查 Commit message 是否合格。如果不合格,就会报错。

1
2
3
$ git add -A 
$ git commit -m "edit markdown"
INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" ! was: edit markdown

生成 Change log

如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成(例1,例2,例3)。

生成的文档包括以下三个部分。

  • New features
  • Bug fixes
  • Breaking changes.

每个部分都会罗列相关的 commit ,并且有指向这些 commit 的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。

conventional-changelog 就是生成 Change log
的工具,运行下面的命令即可。

1
2
3
$ npm install -g conventional-changelog
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -w

上面命令不会覆盖以前的 Change log,只会在CHANGELOG.md的头部加上自从上次发布以来的变动。

如果你想生成所有发布的 Change log,要改为运行下面的命令。

1
$ conventional-changelog -p angular -i CHANGELOG.md -w -r 0

为了方便使用,可以将其写入package.json的scripts字段。

1
2
3
4
5
{
"scripts": {
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0"
}
}

以后,直接运行下面的命令即可。

1
npm run changelog

Git flow script(命令行)

Git Flow不仅仅是一种规范,还提供了一套方便的工具。大大简化了执行Git Flow的过程。

安装

  1. OSX
1
brew install git-flow
  1. Linux
1
apt-get/yum/dnf install git-flow
  1. Windows(cygwin)
1
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitf

Git Flow SourceTree (图形化)

SourceTree下载官方:Sourcetree | Free Git GUI for Mac and Windows

大神推荐SourceTree:使用SourceTree - 廖雪峰的官方网站

总结

Git Flow模型通过不同的分支从源代码管理的角度对软件开发活动进行了约束,为我们的软件开发提供了一个可供参考的管理模型。Git
Flow模型让代码仓库保持整洁,让小组各个成员之间的开发相互隔离,能够有效避免处于开发状态中的代码相互影响而导致的效率低下和混乱。但同时,不同的开发团队存在不同的文化,在不同的项目背景情况下都可能根据该模型进行适当的精简或扩充。防控中心通过合理使用Git
Flow,更好地管理代码仓库,提高工作的效率。

编者按语

尘缨世网重重缚,回顾方知出得难

相从勉讲学,事业在积累。

成名每在穷苦日,败事多于得志时。

参考文献

阮一峰的网络日志-Commit message 和 Change log 编写指南

Jeff Lee github page - 更优雅的提交你的 Git Commit Message

规范 commit 与 changelog 生成


Git Flow 教程
https://allendericdalexander.github.io/2023/12/22/GitFlow/
作者
AtLuoFu
发布于
2023年12月22日
许可协议