Git-Commit message 和 Change log

Git 每次提交代碼,都要寫 Commit message(提交說明),否則就不允許提交。

$ git commit -m "hello world"

上面代碼的-m參數,就是用來指定 commit mesage 的。

如果一行不夠,可以只執行git commit,就會跳出文本編輯器,讓你寫多行。

$ git commit

可以這樣

Commit Logs From Last Night

這樣

Funny initial git commit messages

或者這樣

Fixed the fuck out of #193!

commit message.png

一般來說,commit message 應該清晰明了,說明本次提交的目的。


Angular 規范.png

目前,社區有多種 Commit message 的寫法規范。本文介紹Angular規范(見上圖),這是目前使用最廣的寫法,比較合理和系統化,并且有配套的工具。

Commit message 的作用

格式化的Commit message,有幾個好處。

(1)提供更多的歷史信息,方便快速瀏覽。比如,下面的命令顯示上次發布后的變動,每個commit占據一行。你只看行首,就知道某次 commit 的目的。

$ git log <last tag> HEAD --pretty=format:%s
log

(2)可以過濾某些commit(比如文檔改動),便于快速查找信息。

比如,下面的命令僅僅顯示本次發布新增加的功能。

$ git log <last release> HEAD --grep feat
featMessage.png

3)可以直接從commit生成Change log。
Change Log 是發布新版本時,用來說明與上一個版本差異的文檔,詳見后文。

Change log.png

Commit message 的格式

每次提交,Commit message 都包括三個部分:Header,Body 和 Footer。

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

其中,Header 是必需的,BodyFooter 可以省略。
不管是哪一個部分,任何一行都不得超過72個字符(或100個字符)。這是為了避免自動換行影響美觀。

Header

Header部分只有一行,包括三個字段:type(必需)、scope(可選)和subject(必需)。

  • type

type用于說明commit的類別,只允許使用下面7個標識。

  1. feat 新功能(feature)
  2. fix 修補bug
  3. docs 文檔(documentation)
  4. style 格式(不影響代碼運行的變動)
  5. ref 重構(即不是新增功能,也不是修改bug的代碼變動)
  6. test 增加測試
  7. chore 構建過程或輔助工具的變動

如果typefeatfix,則該commit將肯定出現在Change log之中。其他情況(docschorestylerefactortest)由你決定,要不要放入Change log建議是不要

  • scope scope用于說明commit影響的范圍,比如數據層、控制層、視圖層等等,視項目不同而不同。

  • subject subjectcommit目的的簡短描述,不超過50個字符。

  1. 以動詞開頭,使用第一人稱現在時,比如change,而不是changedchanges

  2. 第一個字母小寫

  3. 結尾不加句號(.)

Body

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

有兩個注意點。

  1. 使用第一人稱現在時,比如使用change而不是changedchanges
  2. 應該說明代碼變動的動機,以及與以前行為的對比

Footer

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.
  • 關閉 Issue

如果當前commit針對某個issue,那么可以在Footer部分關閉這個issue

Closes #234

也可以一次關閉多個 issue 。

Closes #123, #245, #992

Revert

還有一種特殊情況,如果當前commit用于撤銷以前的commit,則必須以revert:開頭,后面跟著被撤銷CommitHeader

revert: feat(pencil): add 'graphiteWidth' option

This reverts commit 667ecc1654a317a13331b17617d973392f415f02.

Body部分的格式是固定的,必須寫成This reverts commit <hash>,其中的hash是被撤銷commitSHA標識符。

如果當前commit與被撤銷的commit,在同一個發布(release)里面,那么它們都不會出現在Change log里面。如果兩者在不同的發布,那么當前commit,會出現在 Change logReverts小標題下面。

Commitizen

Commitizen是一個撰寫合格Commit message的工具。

安裝命令如下。(遇到缺少package.json文件的解決辦法在文章最后)

$ npm install -g commitizen 
$ npm install -g cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

以后,凡是用到git commit命令,一律改為使用git cz。這時,就會出現選項,用來生成符合格式的Commit message

git_cz.png

validate-commit-msg

validate-commit-msg 用于檢查 Node 項目的 Commit message 是否符合格式。

它的安裝是手動的。

首先,拷貝下面這個JS文件,放入你的代碼庫。文件名可以取為validate-commit-msg.js

接著,把這個腳本加入Githook。下面是在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:karma/CHANGELOG.md, 例2:btford/grunt-conventional-changelog)。

生成的文檔包括以下三個部分。

  • New features
  • Bug fixes
  • Breaking changes

每個部分都會羅列相關的commit,并且有指向這些commit的鏈接。當然,生成的文檔允許手動修改,所以發布前,你還可以添加其他內容。

conventional-changelog-cli就是生成Change log的工具,運行下面的命令即可。

$ npm install -g conventional-changelog-cli
$ cd my-project

打印到屏幕

$ conventional-changelog -p angular -i CHANGELOG.md -w

輸出到文件

$ conventional-changelog -p angular -i CHANGELOG.md -s

上面命令不會覆蓋以前的Change log,只會在CHANGELOG.md的頭部加上自從上次發布以來的變動。

如果你想生成所有發布的Change log,要改為運行下面的命令。

$ conventional-changelog -p angular -i CHANGELOG.md -s -r 0

為了方便使用,可以將其寫入package.jsonscripts字段。

{
  "scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0"
  }
}

以后,直接運行下面的命令即可。

$ npm run changelog

缺少package.json文件

因為commitizen工具是基于Node.js的,而我們iOS項目工程目錄下是沒有package.json文件,所以會報錯:

Error: ENOENT: no such file or directory, open '/Users/***/package.json

關于這個問題,可以參考這個commitizenissueUsage in non-node projects?,對于非Node的項目,我們可先在我們項目中添加一個空的package.json文件,然后再輸入命令:

$ npm init --yes

先初始化配置package.json文件,然后再輸入命令:

$ commitizen init cz-conventional-changelog --save --save-exact

參考文章:

Commit message 和 Change log 編寫指南

Commit Message & Change Log

Git Commit Message Conventions

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 每一次commit是階段性的Ending,應記錄著這一階段所完成的事以及關注點,盡可能詳細具體。 注:如果可以的話...
    Jisen閱讀 8,135評論 2 6
  • 來源:[Git 提交的正確姿勢:Commit message 編寫指南](http://www.oschina.n...
    xiacheng閱讀 1,927評論 0 2
  • Git 每次提交代碼, 都要寫 Commit message (提交說明), 否則就不允許提交 $ git com...
    oneofai閱讀 14,508評論 1 2
  • 分享提綱 面向大三的學弟學妹們,講述自己的經歷,給他們鼓勁 --- 大家都一樣。 1. 學習方式:讀書是首要!但實...
    蕭然AND沐橦閱讀 1,007評論 0 0