每一次commit是階段性的Ending隧膏,應(yīng)記錄著這一階段所完成的事以及關(guān)注點(diǎn),盡可能詳細(xì)具體赞咙。
注:如果可以的話饵隙,提交信息應(yīng)通過(guò) E-mail 發(fā)送給工程師和其它關(guān)注項(xiàng)目的人。
Commit Message格式化
每個(gè)commit message應(yīng)該包含一個(gè)header
歌粥、一個(gè)body
和一個(gè)footer
塌忽;header有一個(gè)特殊的格式,包含type
(類(lèi)型)失驶、scope
(作用域)和subject
(主題):
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
header是必須有的土居,但是其scope是可選的。
注意:commit message的任何行不能超過(guò)100個(gè)字符嬉探,方便閱讀擦耀。
樣例:
docs(changelog): update change log to beta.5
上圖 Angular Commit Message
就是很好的范例。
Type
提交類(lèi)型涩堤,必須是下列之一:
- build:影響構(gòu)建系統(tǒng)或外部依賴(lài)的改變
- ci:改變CI配置文件和腳本
- docs:只改變文檔
- feat:一個(gè)新功能
- fix:一個(gè)bug fix
- perf:代碼更改,提高了性能
- refactor:代碼重構(gòu)
- style:不影響代碼含義埂奈,只是代碼風(fēng)格的改變
- test:添加缺失的測(cè)試或修正現(xiàn)有的測(cè)試
- wip:移除文件或者代碼
Scope
scope應(yīng)該是被影響的包的名稱(chēng),這樣能方便閱讀根據(jù)提交信息生成的更新日志定躏。
比如账磺,工具類(lèi)的包名為Tools
芹敌,本次提交為工具類(lèi)里的修改,那么scope就為T(mén)ools:
feat(Tools): add a data utils
具體的scope根據(jù)項(xiàng)目中各模塊的包名而定垮抗。
subject
subject是 commit 目的的簡(jiǎn)短描述:
- 以動(dòng)詞開(kāi)頭氏捞,使用第一人稱(chēng)現(xiàn)在時(shí),比如change冒版,而不是changed或changes
- 第一個(gè)字母小寫(xiě)
- 結(jié)尾不加句號(hào)(.)
Body
Body 部分是對(duì)本次 commit 的詳細(xì)描述液茎,可以分成多行。
注意:
- 使用第一人稱(chēng)現(xiàn)在時(shí)辞嗡,比如使用change而不是changed或changes捆等。
- 應(yīng)該說(shuō)明代碼變動(dòng)的動(dòng)機(jī),以及與以前行為的對(duì)比续室。
Footer
Footer分兩種情況:
- 不兼容變動(dòng):如果當(dāng)前代碼與上一個(gè)版本不兼容栋烤,則 Footer 部分以BREAKING CHANGE開(kāi)頭,后面是對(duì)變動(dòng)的描述挺狰、以及變動(dòng)理由和遷移方法明郭。
- 關(guān)閉 Issue:如果當(dāng)前 commit 針對(duì)某個(gè)issue,那么可以在 Footer 部分關(guān)閉這個(gè) issue 丰泊。
Revert
還有一種特殊情況薯定,如果當(dāng)前 commit 用于撤銷(xiāo)以前的 commit,則必須以revert:開(kāi)頭瞳购,后面跟著被撤銷(xiāo) Commit 的 Header话侄。
revert: feat(pencil): add 'graphiteWidth' option
This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必須寫(xiě)成This reverts commit <hash>.学赛,其中的hash是被撤銷(xiāo) commit 的 SHA 標(biāo)識(shí)符满葛。
NPM
npm是隨同Node.js一起安裝的包管理工具,后面介紹的工具Commitizen罢屈、conventional-changelog都要使用npm
來(lái)安裝嘀韧。
既然是Node.js的包管理工具,那么首先就要下載Node.js缠捌,通過(guò)Node.js下載地址下載安裝Node.js锄贷。
然后安裝npm
:
curl -L https://www.npmjs.com/install.sh | sh
Commitizen
Commitizen是一個(gè)格式化commit message的工具。
通過(guò)上面安裝好的npm
來(lái)安裝:
npm install -g commitizen
而我們用的是Angular
的commit message規(guī)范曼月,那么就在我們項(xiàng)目的目錄下輸入以下命令:
commitizen init cz-conventional-changelog --save --save-exact
但是注意谊却,因?yàn)閏ommitizen工具是基于Node.js的,而我們iOS項(xiàng)目工程目錄下是沒(méi)有package.json
文件哑芹,所以會(huì)報(bào)錯(cuò):
Error: ENOENT: no such file or directory, open '/Users/***/package.json
關(guān)于這個(gè)問(wèn)題炎辨,可以參考這個(gè)commitizen的issue:Usage in non-node projects?,對(duì)于非Node的項(xiàng)目聪姿,我們可先在我們項(xiàng)目中添加一個(gè)空的package.json
文件碴萧,然后再輸入命令:
npm init --yes
先初始化配置package.json
文件乙嘀,然后再輸入命令:
commitizen init cz-conventional-changelog --save --save-exact
看到以下信息,且沒(méi)有報(bào)錯(cuò)表示成功:
這樣當(dāng)我們提交的時(shí)候破喻,就用git cz
替換git commit
命令虎谢,會(huì)出現(xiàn)提交類(lèi)型的選擇:
然后根據(jù)提示選擇、輸入就是了曹质。
注意如果是第二次配置婴噩,需要用--force
:
commitizen init cz-conventional-changelog --save --force
生成CHANGELOG
conventional-changelog就是生成 Change log 的工具。
運(yùn)行下列命令:
$ npm install -g conventional-changelog
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -w
但是最后出現(xiàn)command not found
羽德,以為是conventional-changelog沒(méi)有安裝几莽,通過(guò)命令:
npm ls -g -depth=0
打印出:
/usr/local/lib
├── commitizen@2.9.6
├── conventional-changelog@1.1.0
├── cz-conventional-changelog@2.0.0
└── npm@4.3.0
明明是有的,苦思不得其解宅静,最后在這篇文章Git 提交記錄和分支模型中發(fā)現(xiàn)Commitizen就依據(jù)conventional message章蚣,創(chuàng)建起一個(gè)生態(tài):
- conventional-changelog-cli:通過(guò)提交記錄生成 CHANGELOG.md
- conventional-github-releaser:通過(guò)提交記錄生成 github release 中的變更描述
- conventional-recommended-bump:根據(jù)提交記錄判斷需要升級(jí) Semantic Versioning 哪一位版本號(hào)
- validate-commit-msg:檢查提交記錄是否符合約定
于是就改用了conventional-changelog-cli
:
$ npm install -g conventional-changelog-cli
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -s
通過(guò)以上命令你就會(huì)發(fā)現(xiàn)在項(xiàng)目中多了個(gè)CHANGELOG.md
文件,表示生成 Change log成功了坏为。
參考鏈接:
Commit message 和 Change log 編寫(xiě)指南
Git Commit Message Conventions
Angular的 Commit Message Guidelines
Angular的commit message
Git 寫(xiě)出好的 commit message