Git Commit Message

Demon.Lee 2023年11月18日 759次浏览

之前在极客时间上搜索 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 #123Closes #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 信息风格迥异、难以阅读,如何规范?