让你的 commit 更有价值
更新:cz-relax 一键初始化
之前配置 commitizen 需要好几步,例如首先 commitizen 需要进行初始化并且选择 commitizen adapter,然后需要安装 commitlint ,最后可能还需要 husky 配置 git hooks。
现在,只需要两步,就可以完成上面的工作,让一切变得轻松起来。
# 第一步在工作目录安装 cz-relax
npm install cz-relax --save-dev
# 第二步初始化,如果报错提示需要使用force,请在最后添加 --force
npx cz-relax init --language zh提交规范
AngularJS 在开发者文档中关于 git commit 的指导说明,提到严格的 git commit 格式规范可以在浏览项目历史的过程中看到更易读的信息,并且能用 git commit 的信息直接生成 AngularJS 的 change log 。
commit messages 格式规范
commit messages 由 header 、body 、footer 组成。
header 又包含 type 、scope 、subject 。header 是必需的,不过其中的 scope 是可选的。
body 和 footer 可以省略。
<type>(<scope>): <subject>
// 空行
<BLANK LINE>
<body>
// 空行
<BLANK LINE>
<footer>注:为了能在 github 以及各种 git 工具中看得更清晰,commit messages 的每一行都不要超过 100 个字符。
Header
Type
类型必须是以下几种之一:
feat: 新功能
fix: bug 修复
docs: 仅修改文档
style: 修改格式(空格,格式化,省略分号等),对代码运行没有影响
refactor: 重构(既不是修 bug ,也不是加功能)
build: 构建流程、外部依赖变更,比如升级 npm 包、修改 webpack 配置等
perf: 性能优化
test: 测试相关
chore: 对构建过程或辅助工具和库(如文档生成)的更改
ci: ci 相关的更改
除此之外,还有一个特殊的类型 revert ,如果当前提交是为了撤销之前的某次提交,应该用 revert 开头,后面加上被撤销的提交的 header,在 body 中应该注明: This reverts commit <hash>. ,hash 指的就是将要被撤销的 commit SHA 。
Scope
scope 可以指定提交更改的影响范围,这个视项目而定,当修改影响超过单个的 scope 时,可以指定为 * 。
Subject
subject 是指更改的简洁描述,长度约定在 50 个字符以内,通常遵循以下几个规范:
用动词开头,第一人称现在时表述,例如:
change代替changed或changes第一个字母小写
结尾不加句号(.)
Body
body 部分是对本地 commit 的详细描述,可以分成多行。
跟 subject 类似,用动词开头,第一人称现在时表述,例如:change 代替 changed 或 changes。
body 应该说明修改的原因和更改前后的行为对比。
Footer
footer 基本用在这两种情况:
不兼容的改动( Breaking Changes ),通常用
BREAKING CHANGE:开头,后面跟一个空格或两个换行符。剩余的部分就是用来说明这个变动的信息和迁移方法等。关闭 Issue, github 关闭 Issue 的例子
完整的例子
例一: feat
例二: fix
例三: style
规范 commit message 的好处
首行就是简洁实用的关键信息,方便在 git history 中快速浏览
具有详实的 body 和 footer ,可以清晰的看出某次提交的目的和影响
可以通过 type 过滤出想要查找的信息,也可以通过关键字快速查找相关提交
可以直接从 commit 生成 change log
用工具实现规范提交
上面介绍了规范提交的格式,如果让各位同学在 git commit 的时候严格按照上面的规范来写,首先心智是有负担的,得记住不同的类型到底是用来定义什么的,subject 怎么写,body 怎么写,footer 要不要写。其次,对人的规范大部分都是反人性的,所以很可能在过不了多久,就会有同学渐渐的不按照规范来写。靠意志力来控制自己严格按照规范来写是需要额外耗费一些精力的,把精力耗费在这种事情上面实在有些浪费。
用工具实现规范提交的方案,一种是在提交的时候就提示必填字段,另一种是在提交后校验字段是否符合规范。这两种在实际项目中都是很有必要的。
Commitizen
Zen-like commit messages for internet citizens. 嗯~~一种禅意
Commitizen 是一个帮助撰写规范 commit message 的工具。他有一个命令行工具 cz-cli,接下来会把使用 Commitizen 分成几个阶段来介绍。
体验 git cz
你的仓库可能还不是对 Commitizen 友好的,此时运行 git cz 的效果跟 git commit 一样,也就是没有效果。 不过,可以执行 npx git-cz 来体验。
如果想直接运行 git cz 实现语义化的提交,可以根据 streamich/git-cz 文档中说的全局安装 git cz。
除此之外还有一种更推荐的方式,就是让你的仓库对 Commitizen 友好。
Commitizen 友好
全局安装 Commitizen 后,用 cz-conventional-changelog 适配器来初始化你的项目
上面的初始化做了三件事:
安装 cz-conventional-changelog 依赖
把依赖保存到 package.json 的
dependencies或devDependencies中在根目录的 package.json 中 添加如下所示的
config.commitizen
或者,在项目根目录下新建一个 .czrc 文件,内容设置为
现在运行 git cz 效果如下:

cz-customizable 自定义中文配置
通过上面的截图可以看到,提交的配置选项都是英文的,如果想改成中文的,可以使用 cz-customizable 适配器。
运行下面的命令,注意之前已经初始化过一次了,这次再初始化,需要加 --force 覆盖
现在 package.json 中 config.commitizen 字段为:
cz-customizable 文档中说明了查找配置文件的方式有三种,我们按照第一种,在项目根目录创建一个 .cz-config.js 的文件。按照给出的示例 cz-config-EXAMPLE.js 编写我们的 config。 commit-type 可以参考 conventional-commit-types 。
可以点击查看我配置好的文件 qiqihaobenben/commitizen-git/.cz-config.js ,里面中详细的注释。
commitlint 校验提交
Commitizen 文档中开始就介绍到,Commitizen 可以在触发 git commit 钩子之前就能给出提示,但是也明确表示提交时对 commit messages 的校验也是很有用的。毕竟即使用了 Commitzen,也是能绕过去,所以提交最后的校验很重要。
commitlint 可以检查 commit messages 是否符合常规提交格式,需要一份校验配置,推荐 @commitlint/config-conventional 。
在项目根目录创建 commitlint.config.js 文件并设置校验规则:
rules
rules 是由 name 和配置数组构成,配置数组包含
Level [0..2]: 0 是禁用,1 是警告, 2 是错误
always|never: never 是用来规则取反的Value: 规则的 value
可用的规则见https://commitlint.js.org/#/reference-rules。
header-case 单词格式, 例如: lower-case 全小写
header-full-stop 结束符
header-max-length header 最大长度
header-min-length header 最小长度
type
type-enum type 可选值 例如: [ 'feat', 'fix' ]
type-case type 单词格式
type-empty type 是否为空
type-max-length type 最大内容长度
type-min-length type 最小内容长度
scope
scope-enum scope 可选值, 例如 [ 'components', 'utils', 'cli' ]
scope-case scope 单词格式
scope-empty 是否为空
scope-max-length scope 最大内容长度
scope-min-length scope 最小内容长度
subject
subject-case subject 单词格式
subject-empty subject 是否为空
subject-full-stop subject 中止符
subject-max-length subject 最大内容长度
subject-min-length subject 最小内容长度
subject-exclamation-mark 分割符
body-full-stop body 结束符
body-leading-blank body 开头空行
body-empty body 是否为空
body-max-length body 最大内容长度
body-max-line-length body 最大内容行数
body-min-length body 最小内容长度
body-case 单词格式 , 例如: upper-case 全大写
footer-leading-blank footer 开头空行
footer-empty footer 是否为空
footer-max-length footer 最大内容长度
footer-max-line-length footer 最大内容行数
footer-min-length footer 最小内容长度
husky 配合
在项目中安装 husky ,并在项目根目录新建 husky.config.js 文件,加入以下设置:
注意:因为 @commitlint/config-conventional 校验规则遵循 Angular 的规范, 所以我们在用 cz-customizable 自定义中文配置时, 是按照给出的符合 Angular 规范的示例 cz-config-EXAMPLE.js 编写
.cz-config.js的。但是如果你自定义的 Commitizen 配置不符合 Angular 规范,可以使用 commitlint-config-cz 设置校验规则。(推荐还是按照 Angular 规范进行 cz-customizable 自定义配置)
git commit 触发 git cz
在提交的时候,我们都习惯了 git commit ,虽然换成 git cz 不难,但是如果让开发者在 git commit 时无感知的触发 git cz 肯定是更好的,
而且也能避免不熟悉项目的人直接 git commit 提交一些不符合规范的信息。
我们可以在 husky.config.js 中设置:
注意: 在 window 系统,可能需要在 git base 中才能生效。
生成 CHANGELOG
standard-version 是一个使用 semver 和 conventional-commits 支持生成 CHANGELOG 进行版本控制的实用程序。 standard-version 不只是能生成 CHANGELOG , 还能根据 commit 的 type 来进行版本控制。
示例项目
可以查看 commitizen-git ,里面归纳了快速配置 Commitizen 友好仓库的步骤。 差不多三五分钟就能搞定。
可以看一下配置完后,执行 git commit 的效果。

扩展
更复杂的自定义提示
cz-customizable 中自定义配置项通常情况是够用的, commitlint 中校验的规则基本上也是够用的,但是会有比较硬核的开发者会觉得还是不够,还要更多。比如一些 prompt 更加自定义, 提交时询问的 question 添加更多的逻辑,比如可以把一些重要的字段校验提前到 Commitizen 中,或者添加更多自定义的校验。
如果真想这么干,那就去 fork 一份 cz-conventional-changelog 或者 cz-customizable 来改, 或者直接自己写一个 adapter。
Commitizen 友好徽章
如果把仓库配置成了对 Commitizen 友好的话,可以在 README.md 中加上这个小徽章:
参考文档
Last updated