前言
Git 每次提交代碼缸剪,都要寫 Commit message(提交說(shuō)明)策添,否則就不允許提交材部。但是,一般來(lái)說(shuō)唯竹,commit message 應(yīng)該清晰明了乐导,說(shuō)明本次提交的目的。
不過(guò)話說(shuō)回來(lái)浸颓,作為最具個(gè)人創(chuàng)造力和最會(huì)利用工具的物種——程序猿物臂,最好是能有規(guī)范和工具的約束。否者的話产上,你可能看到以下的commit message
:
目前棵磷,社區(qū)有多種 Commit message 的寫法規(guī)范。本文介紹Angular 規(guī)范是目前使用最廣的寫法晋涣,比較合理和系統(tǒng)化仪媒,并且有配套的工具。前前端框架Angular.js采用的就是該規(guī)范谢鹊。如下圖:
Commit message 的作用
提供更多的歷史信息算吩,方便快速瀏覽留凭。
比如,下面的命令顯示上次發(fā)布后的變動(dòng)偎巢,每個(gè)commit占據(jù)一行蔼夜。你只看行首,就知道某次 commit 的目的压昼。
$ git log <last tag> HEAD --pretty=format:%s
可以過(guò)濾某些commit(比如文檔改動(dòng))求冷,便于快速查找信息
$ git log <last release> HEAD --grep feature
可以直接從commit生成Change log。
Change Log 是發(fā)布新版本時(shí)巢音,用來(lái)說(shuō)明與上一個(gè)版本差異的文檔,詳見后文尽超。
其他優(yōu)點(diǎn)
可讀性好官撼,清晰,不必深入看代碼即可了解當(dāng)前commit的作用似谁。
為 Code Reviewing做準(zhǔn)備
方便跟蹤工程歷史
讓其他的開發(fā)者在運(yùn)行 git blame 的時(shí)候想跪謝
提高項(xiàng)目的整體質(zhì)量傲绣,提高個(gè)人工程素質(zhì)
Commit message 的格式
每次提交,Commit message 都包括三個(gè)部分:header巩踏,body 和 footer秃诵。
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
其中,header 是必需的塞琼,body 和 footer 可以省略菠净。
不管是哪一個(gè)部分,任何一行都不得超過(guò)72個(gè)字符(或100個(gè)字符)彪杉。這是為了避免自動(dòng)換行影響美觀毅往。
Header
Header部分只有一行,包括三個(gè)字段:type
(必需)派近、scope
(可選)和subject
(必需)攀唯。
type
用于說(shuō)明 commit 的類別,只允許使用下面7個(gè)標(biāo)識(shí)渴丸。
feat:新功能(feature)
fix:修補(bǔ)bug
docs:文檔(documentation)
style: 格式(不影響代碼運(yùn)行的變動(dòng))
refactor:重構(gòu)(即不是新增功能侯嘀,也不是修改bug的代碼變動(dòng))
test:增加測(cè)試
chore:構(gòu)建過(guò)程或輔助工具的變動(dòng)
如果type為feat
和fix
,則該 commit 將肯定出現(xiàn)在 Change log 之中谱轨。其他情況(docs
戒幔、chore
、style
土童、refactor
溪食、test
)由你決定,要不要放入 Change log娜扇,建議是不要错沃。
scope
scope用于說(shuō)明 commit 影響的范圍栅组,比如數(shù)據(jù)層、控制層枢析、視圖層等等玉掸,視項(xiàng)目不同而不同。
例如在Angular
醒叁,可以是$location
, $browser
, $compile
, $rootScope
, ngHref
, ngClick
, ngView
等司浪。
如果你的修改影響了不止一個(gè)scope
,你可以使用*
代替把沼。
subject
subject
是 commit 目的的簡(jiǎn)短描述啊易,不超過(guò)50個(gè)字符。
其他注意事項(xiàng):
以動(dòng)詞開頭饮睬,使用第一人稱現(xiàn)在時(shí)租谈,比如change,而不是changed或changes
第一個(gè)字母小寫
結(jié)尾不加句號(hào)(.)
Body
Body 部分是對(duì)本次 commit 的詳細(xì)描述捆愁,可以分成多行割去。下面是一個(gè)范例。
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
有兩個(gè)注意點(diǎn):
使用第一人稱現(xiàn)在時(shí)昼丑,比如使用change而不是changed或changes呻逆。
永遠(yuǎn)別忘了第2行是空行
應(yīng)該說(shuō)明代碼變動(dòng)的動(dòng)機(jī),以及與以前行為的對(duì)比菩帝。
Footer
Footer 部分只用于以下兩種情況:
不兼容變動(dòng)
如果當(dāng)前代碼與上一個(gè)版本不兼容咖城,則 Footer 部分以BREAKING CHANGE開頭,后面是對(duì)變動(dòng)的描述呼奢、以及變動(dòng)理由和遷移方法酒繁。
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.
關(guān)閉 Issue
如果當(dāng)前 commit 針對(duì)某個(gè)issue,那么可以在 Footer 部分關(guān)閉這個(gè) issue 控妻。
Closes #234
Revert
還有一種特殊情況州袒,如果當(dāng)前 commit 用于撤銷以前的 commit,則必須以revert:開頭弓候,后面跟著被撤銷 Commit 的 Header郎哭。
revert: feat(pencil): add 'graphiteWidth' option
This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必須寫成This reverts commit <hash>
.菇存,其中的hash是被撤銷 commit 的 SHA 標(biāo)識(shí)符夸研。
如果當(dāng)前 commit 與被撤銷的 commit,在同一個(gè)發(fā)布(release)里面依鸥,那么它們都不會(huì)出現(xiàn)在 Change log 里面亥至。如果兩者在不同的發(fā)布,那么當(dāng)前 commit,會(huì)出現(xiàn)在 Change log 的Reverts小標(biāo)題下面姐扮。
Commitizen
可以使用典型的git工作流程或通過(guò)使用CLI向?qū)?a target="_blank" rel="nofollow">Commitizen來(lái)添加提交消息格式絮供。
安裝
npm install -g commitizen
然后,在項(xiàng)目目錄里茶敏,運(yùn)行下面的命令壤靶,使其支持 Angular 的 Commit message 格式。
commitizen init cz-conventional-changelog --save --save-exact
以后惊搏,凡是用到git commit
命令贮乳,一律改為使用git cz
。這時(shí)恬惯,就會(huì)出現(xiàn)選項(xiàng)向拆,用來(lái)生成符合格式的 Commit message。
validate-commit-msg
validate-commit-msg 用于檢查項(xiàng)目的 Commit message 是否符合Angular規(guī)范酪耳。
該包提供了使用githooks來(lái)校驗(yàn)commit message
的一些二進(jìn)制文件浓恳。在這里,我推薦使用husky葡兑,只需要添加"commitmsg": "validate-commit-msg"
到你的package.json
中的nam scripts
即可.
當(dāng)然奖蔓,你還可以通過(guò)定義配置文件.vcmrc
來(lái)自定義校驗(yàn)格式赞草。詳細(xì)使用請(qǐng)見文檔 validate-commit-msg
生成 Change log
如果你的所有 Commit 都符合 Angular 格式讹堤,那么發(fā)布新版本時(shí), Change log 就可以用腳本自動(dòng)生成厨疙。生成的文檔包括以下三個(gè)部分:
New features
Bug fixes
Breaking changes.
每個(gè)部分都會(huì)羅列相關(guān)的 commit 洲守,并且有指向這些 commit 的鏈接。當(dāng)然沾凄,生成的文檔允許手動(dòng)修改梗醇,所以發(fā)布前,你還可以添加其他內(nèi)容撒蟀。
conventional-changelog 就是生成 Change log 的工具叙谨,運(yùn)行下面的命令即可。
$ npm install -g conventional-changelog
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -w
參考文章
Commit message 和 Change log 編寫指南
Angular.js Git Commit Guidelines