用 commitizen 规范 git commit 提交说明
前言
Git 作为目前开源社区最为火热的分布式系统版本管理工具,当我们在提交代码之前,都是需要添加
Commit message
(提交说明),否则就不允许提交。
1 | $ git commit -m "hello world" |
上面代码的 -m
参数,就是用来指定 commit message
的。
如果一行不够,可以只执行 git commit
,就会跳出文本编辑器,让你写多行。如
1 | $ git commit |
基本上,你写什么都行。
我们先来看下平时提交的 commmit
日志,只是简单的说明本次提交的信息,如
我们再来看下具有一定规范性的 commit
日志,是不是更加清晰明了,有了一定的规范,对提交类型做了区分。
一般来说,commit message
应该清晰明了,说明本次提交的目的。
目前,社区有多种 Commit message 的写法规范。这种是 Angular 规范,中文。这是目前使用最广的写法,是比较合理和系统化,并且有配套的工具。
作用
- 提供更多的历史信息,方便快速浏览。
- 可以过滤某些
commit
(比如文档改动),便于快速查找信息。 - 可以直接从
commit
生成Change log
。
标准 Commit Message 规范
格式
1 | <type>(<scope>): <subject> |
每次提交可以包含页眉(header
)、正文(body
)和页脚(footer
)。其中,Header
是必需的。
每次提交的信息不超过 100
个字符,如
1 | commit f477xxxxxxxba558 (HEAD -> master) |
Header
Header
部分只有一行,包括三个字段:type
(必需)、scope
(可选)和 subject
(必需)。
type
用于说明commit
的类别
1 | $ git cz |
scope
,用于说明commit
影响的范围subject
是 commit 目的的简短描述,一般不超过 50 个字符。
Body
Body
部分是对本次 commit 的详细描述,可以分成多行
Footer
Footer
部分只用于两种情况。
- 不兼容变动
如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述 - 关闭
Issue
如果当前 commit 针对某个 issue,那么可以在 Footer 部分关闭这个 issue 。1
2
3
4// 单个
Closes #123
// 支持多个
Closes #123, #245, #992
开始
上诉 commit
规范看起来是不很麻烦,这里推荐使用一些开源的工具进行管理,我们先来看一下效果
安装插件
方式一
commitizen
– 自动生成合格的 commit message
commitizen
是一个撰写合格 Commit message
的工具,通过 commitizen
我们可以快速生成符合规范的 commit message
,下面我们介绍下怎么在项目中使用。
- 安装
1 | $ npm install -g commitizen |
- 在项目目录里,运行下面的命令,使其支持
Angular
的Commit message
格式。
1 | $ commitizen init cz-conventional-changelog --save --save-exact |
如果出现报错
1 | Attempting to initialize using the npm package cz-conventional-changelog |
可以在指令后面加上 –force
方式二
git-cz
– 插件全局安装
安装git-cz
工具,也可用快速生成符合规范的 commit message
。
1 | $ npm install -g git-cz |
生成 CHANGE LOG
如果需要生成发布记录,可以通过 conventional-changelog-cli
生成。一般情况下,生成的文档包括
- New features
- Bug fixes
- Breaking changes.
其他情况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。
安装
1 | $ npm install -g conventional-changelog-cli |
修改 package.json
1 | "scripts": { |
生成 CHANGELOG.md
1 | $ npm run changelog // 不会覆盖以前的 Change log,只会在CHANGELOG.md的头部加上自从上次发布以来的变动。 |