Git 每次提交代碼,都要寫 Commit message(提交說明),否則就不允許提交。
$ git commit -m "hello world"
上面代碼的-m參數,就是用來指定 commit mesage 的。
如果一行不夠,可以只執行git commit,就會跳出文本編譯器,讓你寫多行。
$ git commit
基本上,你寫什麼都行,可參考如下文章:
http://www.commitlogsfromlastnight.com
http://blog.no-panic.at/2014/10/20/funny-initial-git-commit-messages/
http://whatthecommit.com
但是,一般來說,commit message 應該清晰明了,說明本次提交的目的。
目前,社區有多種 Commit message 的寫法規範(http://whatthecommit.com)。本文介紹Angular 規範(見上圖),這是目前使用最廣的寫法,比較合理和系統化,並且有配套的工具。
格式化的Commit message,有幾個好處。
(1)提供更多的歷史信息,方便快速瀏覽。比如,下面的命令顯示上次發布後的變動,每個commit佔據一行。你只看行首,就知道某次 commit 的目的。
$ git log <last tag> HEAD --pretty=format:%s
比如,下面的命令僅僅顯示本次發布新增加的功能。
$ git log <last release> HEAD --grep feature
(3)可以直接從commit生成Change log。Change Log 是發布新版本時,用來說明與上一個版本差異的文檔,詳見後文。
每次提交,Commit message 都包括三個部分:Header,Body 和 Footer。
<type>(<scope>): <subject>// 空一行<body>// 空一行<footer>
其中,Header 是必需的,Body 和 Footer 可以省略。
不管是哪一個部分,任何一行都不得超過72個字符(或100個字符)。這是為了避免自動換行影響美觀。
2.1 HeaderHeader部分只有一行,包括三個欄位:type(必需)、scope(可選)和subject(必需)。
(1)type
type用於說明 commit 的類別,只允許使用下面7個標識。
feat:新功能(feature)fix:修補bugdocs:文檔(documentation)style: 格式(不影響代碼運行的變動)refactor:重構(即不是新增功能,也不是修改bug的代碼變動)test:增加測試chore:構建過程或輔助工具的變動
如果type為feat和fix,則該 commit 將肯定出現在 Change log 之中。其他情況(docs、chore、style、refactor、test)由你決定,要不要放入 Change log,建議是不要。
(2)scope
scope用於說明 commit 影響的範圍,比如數據層、控制層、視圖層等等,視項目不同而不同。
(3)subject
subject是 commit 目的的簡短描述,不超過50個字符。
以動詞開頭,使用第一人稱現在時,比如change,而不是changed或changes 第一個字母小寫 結尾不加句號(.)
2.2 BodyBody 部分是對本次 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
有兩個注意點。
(1)使用第一人稱現在時,比如使用change而不是changed或changes。
(2)應該說明代碼變動的動機,以及與以前行為的對比。
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
2.4 Revert還有一種特殊情況,如果當前 commit 用於撤銷以前的 commit,則必須以revert:開頭,後面跟著被撤銷 Commit 的 Header。
revert: feat(pencil): add 'graphiteWidth' optionThis reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必須寫成This reverts commit <hash>,其中的hash是被撤銷 commit 的 SHA 標識符。
如果當前 commit 與被撤銷的 commit,在同一個發布(release)裡面,那麼它們都不會出現在 Change log 裡面。如果兩者在不同的發布,那麼當前 commit,會出現在 Change log 的Reverts小標題下面。
三、CommitizenCommitizen是一個撰寫合格 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
五、生成 Change log如果你的所有 Commit 都符合 Angular 格式,那麼發布新版本時, Change log 就可以用腳本自動生成。
例1:https://github.com/ajoslin/conventional-changelog/blob/master/CHANGELOG.md
例2:https://github.com/karma-runner/karma/blob/master/CHANGELOG.md
例3:https://github.com/btford/grunt-conventional-changelog/blob/master/CHANGELOG.md
生成的文檔包括以下三個部分。
New featuresBug fixesBreaking 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
如果喜歡這篇文章,記得點讚與分享給好友。
如果你還想了解更多Android開發最佳實踐、經驗分享、最好用的工具與服務,技術前沿,請長按下方二維碼或搜索微信公眾號:AndroidTrending關注我,我會繼續保持精品。