之前在极客时间上搜索 git 相关内容,看到一篇讲 commit message 规范的,一下就吸住了我,因为我之前写 commit message 都比较随意。等我看完这篇内容后,我就一直努力向规范看齐,不再随意了。原始文章我贴在末尾,感兴趣的小伙伴可以去看看(记得登录哦)。
1、why:一个好的 commit message 有什么用?
- 最基本:满足相关人员了解变更了啥;
- 可读性:有分类,可以快速查找相关变更或浏览变更历史;
- 自动化:根据规范化内容自动触发 CI 等,并且支持生成版本的 change log;
- ……
2、what:一个好的 commit message 长啥样?
社区有不少 commit message 规范,但目前使用最多的是 Angular 规范,究其原因,主要有两点:
- 语义化:每个 commit message 都会被归类为一个有意义的类型,也就是分类;
- 规范化:commit message 有规定的格式,这些格式不仅给人看,也能被软件工具识别。
上面和下面的这两张图是笔者从 Angular 官方截取过来的样例。
3、how:怎样写出一个好的 commit message?
格式:
<type>[optional scope]: <description>
// 此处空一行
[optional body]
// 此处空一行
[optional footer(s)]
结合前面的样例,我们来拆解一下规范的 commit message。简单来说,Angular 规范将其划分成了三块:
1)Header:只有一行,必选。
-
type 是 commit 类型,必选,主要有两类:Development 和 Production。其中的 Development 一般指项目管理类变更,不会影响代码,像 CI 流程、构建方式等属于这类;而 Production 就是涉及代码变更的操作。
如果不确定当前的 commit 属于哪一种类型,可以参考下图。
-
scope 是 commit 的影响范围,要求用名词,可选。scope 不能太具体,因为那样会引起膨胀(即出现太多的 scope),从而失去分类本身的目的。一般可以根据组件名或功能模块来划分,而且要将其文档化,即让团队达成共识,样例可参考下图。
-
subject 是 commit 的简单描述,必须以动词开头且第一个字母要小写,必选。另外,subject 结尾没有英文句号。
从示例中,我们也可以看到 scope 需要用小括号 () 括起来,<type>[<scope>]
之后则紧跟冒号,冒号后面再紧跟空格。
2)Body:对 commit 的概述,可以有多行,格式比较自由,可选。
通过 body 中的内容,我们可以知道本次提交都做了哪些具体的变更。一般使用现在时描述当前的改动,内容包括修改的动机以及与上一版的差异(即改动点)等。
3)Footer:用来描述本次 commit 改动导致的后果,可选。 Footer 有自己的格式:
BREAKING CHANGE: <breaking change summary>
// 空行
<breaking change description + migration instructions>
// 空行
// 空行
Fixes #<issue number>
一般使用 Footer 来说明不兼容的改动和关闭的 issue 列表。不兼容的改动需要使用 BREAKING CHANGE:
开头,并跟上本次不兼容改动的摘要,而后续的其他部分则用来描述变动的理由,迁移方法等。如果是关闭 issue,则需要在 Footer 部分新开一行,并以 Closes
开头,比如 Closes #123
或 Closes #123, #223, #130
。
最后再补充两点:
1)为了方便在 git 等工具上阅读 commit message,一般会限制每行 message 的字符长度,常见的有:50/72/100 三种标准;
2)针对还原之前 commit 的 revert 操作,需要以 revert:
开头,后面跟上还原的 commit Header。Body 中则需要写成 This reverts commit <hash>
,其中的 hash 就是还原的 commit SHA 标识,样例如下:
revert: feat(iam-apiserver): add 'Host' option
This reverts commit 079360c7cfc830ea8a6e13f4c8b8114febc9b48a.
搞标准化,是为了实现自动化,把人抽出来,再让机器转起来:具体(样例)–> 抽象(模型)–> 简单 --> 标准(流程)–> 自动(程序)–> 规模。
延伸阅读:
孔令飞 · 《规范设计(下):commit 信息风格迥异、难以阅读,如何规范?》