Commit message代码提交规范
目录
一、简述
commit message 提交说明
:应清晰明了,说明本次提交目的
社区有多种 Commit message 的写法规范。
Angular 规范(如图)是目前使用最广的写法,比较合理和系统化,并且有配套的工具。
Commit message 的作用:
1、提供更多的历史信息,方便快速浏览
比如,下面的命令显示上次发布后的变动,每个commit占据一行。只看行首可知某次commit目的(图见下)
$ git log <last tag> HEAD --pretty=format:%s
2、过滤某些commit(比如文档改动),便于快速查找信息
比如,下面的命令仅仅显示本次发布新增加的功能
$ git log <last release> HEAD --grep feature
3、直接从commit生成Change log
Change Log 是发布新版本时,用来说明与上一个版本差异的文档
4、可读性好,清晰,快速了解当前commit的作用
5、为 Code Reviewing(代码审查)做准备
6、方便跟踪工程历史
7、提高项目的整体质量,提高个人工程素质
二、Commit message格式–命令行方式
Commit message 包括三个部分:Header
,Body
和 Footer
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
1、Header
只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)
(1)type:说明 commit 的类别,只允许使用下面的标识
- feat:新增功能(feature)
- fix/to:修补bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
- docs:文档(documentation),仅仅修改了文档,比如 README, CHANGELOG, CONTRIBUTE等等
- style: 格式(不影响代码运行的变动),仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试,包括单元测试、集成测试等
- chore:构建过程或辅助工具的变动
- type:代表某次提交的类型,比如是修复一个bug还是增加一个新的feature
- perf: 优化相关,比如提升性能、体验
- revert: 回滚到上一个版本
- ci:自动化流程配置修改
- merge:代码合并
- sync:同步主线或分支的Bug
注:
若type为feat和fix,则该 commit 将肯定出现在 Change log 之中;
其他情况(docs、chore、style、refactor、test)由自己决定是否放入 Change log,建议不要。
(2)scope:说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
(3)subject:
subject是 commit 目的的简短描述,不超过50个字符。
a.建议使用中文(感觉中国人用中文描述问题能更清楚一些)。
b.以动词开头,使用第一人称现在时,比如change,而不是changed或changes
c.第一个字母小写
d.结尾不加句号(.)或其他标点符号
根据以上规范git commit message将是如下的格式
fix(DAO):用户查询缺少username属性
feat(Controller):用户查询接口开发
2、Body
对本次 commit 的详细描述,可以分成多行
More detailed explanatory text, if necessary. Wrap it to
about 72 characters or so.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Use a hanging indent
注:
a.使用第一人称现在时,比如使用change而不是changed或changes。
b.应该说明代码变动的动机,以及与以前行为的对比。
3、Footer
只用于两种情况:不兼容变动
、关闭 Issue
(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是被撤销 commit 的 SHA 标识符。
② 如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts小标题下面。
三、工具
1、Commitizen
Commitizen是一个格式化commit message的工具。
安装命令:
$ npm install -g commitizen
Then,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。
$ commitizen init cz-conventional-changelog --save --save-exact
After,凡是用到git commit命令,一律改为使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。
2、validate-commit-msg
validate-commit-msg 用于检查 Node 项目的 Commit message 是否符合格式。
手动安装
First,拷贝下面这个JS文件,放入代码库。文件名可以取为validate-commit-msg.js。
Then,把这个脚本加入 Git 的 hook。下面是在package.json里面使用 ghooks,把这个脚本加为commit-msg时运行。
"config": {
"ghooks": {
"commit-msg": "./validate-commit-msg.js"
}
}
Finally,每次git commit的时候,这个脚本就会自动检查 Commit message 是否合格。如果不合格,就会报错。
$ git add -A
$ git commit -m "edit markdown"
INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" ! was: edit markdown
四、TortoiseSVN提交日志规范
日志提交简单规则:
message提交:版本号 type类别 提交信息描述
- 完成某个任务,尽可能提交该任务,原则是一个任务一次提交。
- 提交格式:
[任务号 任务标题]
- 当几个任务一起完成提交时,可以把几个相同类似的任务分批提交:
格式:[功能名称:任务1 编码 任务2 编码 任务3 编码 …… 任务n 编码]
注:不提倡
- 某些原因没有提交正确格式时,需要进行更正:
右键 →Edit log message
更正提交的日志信息
修改保存后,本机这边改变了,其他机器上即便更新代码,并没有改变,因为TortiseSVN会缓存。
需要设置Settings
→Saved Data
中,将Log messages xxx
都 clear 即可
- 提交日志时,以下几项严禁和反对:
1)完全与项目无关的
2)与项目有关但语义不清
相关参考链接
Commit message 代码提交规范
commit message和 Change log 编写指南
Git 提交的正确姿势:Commit message 编写指南
【Git学了就忘-实操(二)】修改已提交commit的message
TortoiseSVN提交日志规范
SVN与TortoiseSVN修改日志和强制写日志实现详解
SVN实现详解与TortoiseSVN修改日志和强制写日志
SVN常见的错误及处理方法
[Subversion] 修改旧版次的讯息与作者名称
[转][SVN] Hook scripts的使用方法
[Subversion] 修改舊版次的訊息與作者名稱
当你为错过太阳而哭泣的时候,你也要再错过群星了。 ——泰戈尔