当你学会使用git,并在GitHub上创建了本身的Repositories时。git
嗯。能够push本身的代码了,一顿github
看到100%以后开心极了。几个月后看到以下npm
因而可知git add和git commit并非很简单的一次所有完成的json
当你每次push的时候,必定是更新了一些代码,完善了一些功能。markdown
例如:架构
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"
复制代码
git add READM.md
git commit -m"modify README"
复制代码
作完以上以后,你就能够正常的工具
git push origin mater
复制代码
固然,这样只是一个简单push测试
你觉得作到上面这些你就能够完成规范的git commit 了吗??优化
太天真你,通常规范的commit须要由三部分构成
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
复制代码
其中,Header 是必需的,Body 和 Footer 能够省略。
不论是哪个部分,任何一行都不得超过72个字符(或100个字符)。这是为了不自动换行影响美观。
Head这部分只有一行,可是包括三个部分
< type >(必需)< scope >(可选)< subject >(必需)
type用来讲明commit的类别,也就是说别人看了你的type就知道你此次push的性质是什么,只容许有如下几种标识
若是type为feat和fix,则该 commit 将确定出如今 Change log 之中。其余状况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。
scope用于说明commit的影响范围,好比数据层,控制层,视图层等
(可选)类型后面能够加上括号,括号内填写主要变更的范围,好比按功能模块分,某模块;或按项目三层架构模式分,分数据 层、控制层之类的。
#:表示模块
#student --> 表示 学生模块 (具体的模块开头字母小写,驼峰命名)
#ALL --> 表示 全部模块 (特殊含义如ALL表全部,MOST表大部分,用大写字母表示)
#MOST --> 表示 大部分模块
复制代码
e.g. feat(#student): 新增添加学生的功能 —— 表示student模块新增功能,功能是添加学生
subject是 commit 目的的简短描述,不超过50个字符。
- 以动词开头,使用第一人称如今时,好比change,而不是changed或changes
- 第一个字母小写
- 结尾不加句号(.)
复制代码
body部分是对本次commit的详细描述,能够分红多行进行描述能够分红多行,正文在 72 个字符处换行。
使用正文解释是什么(what)和为何(why),而不是如何作,以及与之前行为的对比。
因而能够这样写:
balabala : balabala
what:
balabala
why:
balabala
复制代码
Footer只用于两种状况
若是当前代码与上一个版本不兼容,则 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.
复制代码
若是当前 commit 针对某个issue,那么能够在 Footer 部分关闭这个 issue 。
Closes #234
复制代码
也能够一次关闭多个 issue 。
Closes #123, #245, #992
复制代码
还有一种特殊状况,若是当前 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小标题下面。
Commitizen是一个撰写合格 Commit message 的工具。
安装命令以下。
$ npm install -g commitizen
复制代码
而后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。
$ commitizen init cz-conventional-changelog --save --save-exact
复制代码
之后,凡是用到git commit命令,一概改成使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。
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
复制代码
若是你的全部 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!!