Git Commit 規範參考

引子

在 github 上逛逛就能夠發現,其提交的 commit 都有必定格式,工做中也有相應的規定,時間長了就能體會到其中的好處。這種約束是一種良好的實踐。抽出一些時間,更詳細的瞭解相關的資料,而後作了一些實踐和總結。html

規範 Commit 的好處

  1. 提供更明確的歷史信息,方便判斷提交目的和瀏覽
  2. 能夠過濾某些沒必要要的提交,方便快速查找信息
  3. 自動化生成 Changelog
  4. 向同事、公衆與其餘利益關係人傳達變化的性質
  5. 基於提交的類型,自動決定語義化的版本變動

以上的好處,我的認爲要有一個大的前提,就是每個提交,儘可能保證其目的單一性,好比說幾個 bug 看似相似,就一次性修改提交。這樣作,讓 commit 的信息變的複雜化,閱讀不方便,也容易讓人想到一些沒必要要的關聯性。vue

Commit 的格式

找了幾個 start 較多的庫,看看提交的格式。node

  1. react-commit

react-commit

  1. vuejs-commit

vuejs-commit

  1. angular-commit

angular-commit

網上推薦的寫法是第 2 和 3 種,也就是 Angular 規範,並有配套的工具。有一個文檔對 commit 的格式要求有個描述叫約定式提交。下面就根據 Angular 規範和對應文檔,看看詳細的說明。react

每一個 commit message 包含一個 headerbodyfooterheader 有一個特殊的格式包含有 typescopesubjectgit

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
複製代碼

header、body、footer 之間都要空一行,header 是必填項,scope 是選填項。commit message 的每一行的文字不能超過 100 個字符。這樣子在 github 和 git 工具上更便於閱讀。github

Type

type 用於說明 commit 的類別,必須爲如下類型的一種:express

  • feat: 新的功能
  • fix: 修復 bug
  • docs: 只是文檔的更改
  • style: 不影響代碼含義的更改 (例如空格、格式化、少了分號)
  • refactor: 既不是修復 bug 也不是添加新功能的代碼更改
  • perf: 提升性能的代碼更改
  • test: 添加或修正測試
  • chore: 對構建或者輔助工具的更改,例如生成文檔

Scope

scope 用於說明 commit 影響的範圍,當影響的範圍有多個時候,可使用 *npm

Subject

subject 用於對 commit 變化的簡潔描述:json

  • 使用祈使句,通常以動詞原形開始,例如使用 change 而不是 changed 或者 changes
  • 第一個字母小寫
  • 結尾不加句號(.)

Body

body 用於對 commit 詳細描述。使用祈使句,通常以動詞原形開始,例如使用 change 而不是 changed 或者 changes。bash

body 應該包含此次變化的動機以及與以前行爲的對比。

Footer

footer 目前用於兩種狀況。

1 不兼容的變更

全部不兼容的變更都必須在 footer 區域進行說明,以 BREAKING CHANGE: 開頭,後面的是對變更的描述,變更的理由和遷移註釋。

BREAKING CHANGE: isolate scope bindings definition has changed and
    the inject option for the directive controller injection was removed.

    To migrate the code follow the example below:

    Before:

    scope: {
      myAttr: 'attribute',
      myBind: 'bind',
      myExpression: 'expression',
      myEval: 'evaluate',
      myAccessor: 'accessor'
    }

    After:

    scope: {
      myAttr: '@',
      myBind: '@',
      myExpression: '&',
      // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
      myAccessor: '=' // in directive's template change myAccessor() to myAccessor } 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
## 關閉多個
Closes #123, #245, #992
複製代碼

Revert

若是 commit 用於撤銷以前的 commit,這個 commit 就應該以 revert: 開頭,後面是撤銷這個 commit 的 header。在 body 裏面應該寫 This reverts commit <hash>.,其中的 hash 是被撤銷 commit 的 SHA 標識符。

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

This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
複製代碼

示例

feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)
複製代碼
fix($compile): couple of unit tests for IE9

Older IEs serialize html uppercased, but IE9 does not
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.

Closes #351
複製代碼
style($location): add couple of missing semi colons
複製代碼
docs(guide): updated fixed docs from Google Docs

Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace

複製代碼

Commit 相關的工具

填寫提示工具 commitizen

這個工具是用來給 commit 一個引導的做用,根據提示一步一步的完善 commit。

在 Windows 環境下安裝,我的遇到的問題有:

一、安裝 commitizen 後,進行初始化,找不到命令

7-failed1

嘗試成功的解決方法是用 yarn 執行指令:

yarn commitizen init cz-conventional-changelog --save-dev --save-exact
複製代碼

二、按照說明裏面直接執行 npx git-cz無效,安裝了 npx 也無效

發如今 node_modules\bin\ 目錄下,並無 npx 相關可執行文件,須要安裝 npx。

安裝後仍是無效,須要用 yarn 來執行指令

yarn npx git-cz
複製代碼

7-npx

能夠發現執行指令後,顯示了對應的可執行文件的路徑。

若是配置了 scripts,那麼提交的時候須要執行對應的指令,纔會觸發這個工具的做用。

還有操做的問題,在本身的戴爾筆記本用上下鍵切換無效,也嘗試過各類組合鍵,也是無效,外接的鍵盤有效。

格式校驗工具 commitlint

validate-commit-msg 已不被推薦使用。安裝對應要使用的提交規範,

#it also works for Windows
yarn add @commitlint/{config-conventional,cli} --dev

# Configure commitlint to use angular config
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
複製代碼

示例用的是 config-conventional 規範,這個安裝後,還須要使用 commitmsg hook,推薦使用 husky。安裝husky

yarn add husky --dev
複製代碼

而後配置 package.json

{
  "scripts": {
    "commitmsg": "commitlint -E GIT_PARAMS"
  }
}
複製代碼

提交時候就會觸發校驗,效果以下圖。

7-validate-commit

2018.12.09: 在最新的版本中,因爲 GIT_PARAMS 參數的問題,進行了更新,配置變化以下:

{
  "scripts": {
- "precommit": "npm test",
- "commitmsg": "commitlint -E GIT_PARAMS"
  },
+ "husky": {
+ "hooks": {
+ "pre-commit": "npm test",
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+ }
+ }
}
複製代碼

或者在項目文件夾下執行下面的命令,會自動進行更正。

./node_modules/.bin/husky-upgrade
複製代碼

生成 Changelog 工具 Conventional Changelog

使用的工具是 Conventional Changelog,推薦使用 standard-version。commit 符合 Conventional Commits Specification 中描述的格式,就能夠用程序自動生成 Changelog。

先進行安裝。

yarn add standard-version --dev
複製代碼

而後配置package.json配置執行的腳本。

{
  "scripts": {
    "release": "standard-version"
  }
}
複製代碼

執行該腳本命令,產生的結果:生成文件 CHANGELOG、自動修改庫的版本號、產生一個 commit,用工具查看以下圖所示。

7-changelog

每一次執行,不會覆蓋以前的 CHANGELOG,只會在 CHANGELOG 的頂部添加新的內容。

感覺

網上有不少相似的介紹,本身動手去實踐,獲得的比看到的多的多。

參考資料

看了北野武主演的《紅鱂魚》,裏面有段臺詞真是精彩:

吃醋要把握好度,吃醋的人心裏不急不躁,這醋也吃的回味無窮。吃醋,也就是嫉妒爲什麼物?本身不去努力不去付諸行動,揪着對方的弱點不放,連本身也落得下做,這就叫做嫉妒。原本爲了和對手相匹敵並超越對方而努力,日復一日這個問題也會迎刃而解,但人老是作不到這一點,由於嫉妒比較輕鬆。

現實就是答案,就算抱怨生不逢時,社會不公,也不會有任何改變。現實就是現實,要理解現狀而且分析,在那其中必定會有致使現狀的緣由,對緣由有了充分認識以後再據此付諸行動就好。連現狀都不懂得判斷的人,在我看來就是白癡。

60-poster
相關文章
相關標籤/搜索