git commit 的重要性
当你学会使用git,并在GitHub上建立了自己的Repositories时。
嗯。可以push自己的代码了,一顿
- git pull origin master
- git add .
- git commit -m"balabala"
- git push origin master
看到100%之后开心极了。几个月后看到如下

由此可见git add和git commit并不是很简单的一次全部完成的
正确的使用git add 和 git commit
当你每次push的时候,一定是更新了一些代码,完善了一些功能。
例如:
1. 注册功能
2. 登录功能
3. 完善了README
那么该如何的push这次代码呢??
- 提交注册功能的功能代码
git add src/register
git commit -m"add register function"
- 提交登录功能的代码
git add src/login
git commit -m"add login function"
- 提交完善的README
git add READM.md
git commit -m"modify README"
做完以上之后,你就可以正常的
git push origin mater
当然,这样只是一个简单push
进一步的规范你的git commit
你以为做到上面这些你就可以完成规范的git commit 了吗??
太天真你,一般规范的commit需要由三部分构成
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略。
不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。
1.Header
Head这部分只有一行,但是包括三个部分
< type >(必需)< scope >(可选)< subject >(必需)
(1) < type >
type用来说明commit的类别,也就是说别人看了你的type就知道你这次push的性质是什么,只允许有以下几种标识
- init: 初始化项目,往往用于仓库刚刚建立,建好项目框架之后的一次push
- feat: 新功能(feature)
- docs: 文档的提交(document)
- fix: 修补bug
- style: 格式的改动(不影响代码运行的变动,往往是规范了代码的格式)
- refactor: 重构(既不增加新功能,也不改任何的bug)
- test: 增加测试
- chore: 构建过程或辅助工具的变动
- opt: 优化和改善,比如弹窗进行确认提示等相关的,不会改动逻辑和具体功能等
- other: 用于难以分类的类别(不建议使用,但一些如删除不必要的文件,更新.ignore之类的可以使用)
如果type为feat和fix,则该 commit 将肯定出现在 Change log 之中。其他情况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。
(2) < scope >
scope用于说明commit的影响范围,比如数据层,控制层,视图层等
(可选)类型后面可以加上括号,括号内填写主要变动的范围,比如按功能模块分,某模块;或按项目三层架构模式分,分数据 层、控制层之类的。
#:表示模块
#student --> 表示 学生模块 (具体的模块开头字母小写,驼峰命名)
#ALL --> 表示 所有模块 (特殊含义如ALL表所有,MOST表大部分,用大写字母表示)
#MOST --> 表示 大部分模块
e.g. feat(#student): 新增添加学生的功能 —— 表示student模块新增功能,功能是添加学生
(3)< subject >
subject是 commit 目的的简短描述,不超过50个字符。
- 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
- 第一个字母小写
- 结尾不加句号(.)
2. Body
body部分是对本次commit的详细描述,可以分成多行进行描述可以分成多行,正文在 72 个字符处换行。
使用正文解释是什么(what)和为什么(why),而不是如何做,以及与以前行为的对比。
于是可以这样写:
balabala : balabala
what:
balabala
why:
balabala
3. Footer
Footer只用于两种情况
(1)不兼容变动
如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
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.
(2)关闭 Issue
如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。
Closes #234
也可以一次关闭多个 issue 。
Closes #123, #245, #992
4. Revert
还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以revert:开头,后面跟着被撤销 Commit 的 Header。
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小标题下面。
几个优秀的撰写合格的commit的工具
1. Commitizen
Commitizen是一个撰写合格 Commit message 的工具。
安装命令如下。
$ npm install -g commitizen
然后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。
$ commitizen init cz-conventional-changelog --save --save-exact
以后,凡是用到git commit命令,一律改为使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。

2. validate-commit-msg
validate-commit-msg 用于检查 Node 项目的 Commit message 是否符合格式。
它的安装是手动的。首先,拷贝下面这个JS文件,放入你的代码库。文件名可以取为validate-commit-msg.js。
接着,把这个脚本加入 Git 的 hook。下面是在package.json里面使用 ghooks,把这个脚本加为commit-msg时运行.
"config": {
"ghooks": {
"commit-msg": "./validate-commit-msg.js"
}
}
然后,每次git commit的时候,这个脚本就会自动检查 Commit message 是否合格。如果不合格,就会报错。
$ git add -A
$ git commit -m "edit markdown"
INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" ! was: edit markdown
3. conventional-changelog
如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成。
生成的文档包括以下三个部分。
- New features
- Bug fixes
- Breaking changes.
每个部分都会罗列相关的 commit ,并且有指向这些commit的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。
conventional-changelog 就是生成 Change log 的工具,运行下面的命令即可。
$ npm install -g conventional-changelog
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -w
上面命令不会覆盖以前的 Change log,只会在CHANGELOG.md的头部加上自从上次发布以来的变动。
如果你想生成所有发布的 Change log,要改为运行下面的命令。
$ conventional-changelog -p angular -i CHANGELOG.md -w -r 0
为了方便使用,可以将其写入package.json的scripts字段。
{
"scripts": {
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0"
}
}
以后,直接运行下面的命令即可。
$ npm run changelog
(完)
以上内容仅代表作者自己的个人观点,欢迎广大专业人士提出建议
Thank You!!