Git Commit 標準化

吳佰清發表於2019-01-23

 

 

1 前言
Git Commit Message 應該清晰明瞭,要用精簡的語言說明本次提交的目的,其主要作用是為
了後續的搜尋、版本的回滾、合併衝突的追溯等操作。 

我們在開發時一直以來對 Git Commit 格式有個約定俗稱的要求,所以就沒落實明確的規範。
因為沒有明確的規範,就會導致提交的訊息較為隨意。甚至出現「“.”、”Update”」這樣的訊息。

直到我在 GitHub 上發現了這條 Commits 時,才意識到提交資訊也該規範起來。 

以下圖舉例,當程式碼出現 Bug 時,應該回滾到哪個版本?
回滾到 “朕與將軍解戰袍,芙蓉暖帳度春宵” 嗎?
這條記錄所變更的內容是啥,看概要我一概不知。 ︿( ̄︶ ̄)︿


為了解決規範問題,我參考了一些的開源專案,當發現 commitizen 庫時,才知道好多大型開
源(AngularJSVueJS)專案早已使用了它。所以在接下來我會介紹一下 commitizen 工具所
使用 Google AngularJS 規範。


2 規範介紹
這次主要介紹 AngularJS 的規範,它是由 Google 推出的一套提交訊息規範標準,也是目前使
用範圍最廣的規範。有一套合理的手冊也較為系統化;並且還有配套的工具可以供我們使用。

說白了,規範就是用工具進行強約束。單看規範比較簡單,所以先讓大家先看看面,知道他的
大體規則後,在來講細節。

規範執行方案如下:  


既然有了方案,就會按照某些規則執行,以下是 Google AnguarJS 規範的要求:

規範目標
- 允許通過指令碼生成 CHANGELOG.md
- 可以通過範圍的關鍵詞,快速的搜尋到指定版本

git log HEAD --grep feat(package.json) # 在package.json檔案裡新增的特性。 

格式要求

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

- 訊息只佔用一行,任何行都不能超過 100 個字元
- 允許使用 GitHub 以及各種 Git 工具閱讀訊息
- 提交訊息由頁首、正文和頁尾組成,由空行分隔

<type>
代表某次提交的型別,比如是修復一個 bug 或是增加一個 feature,型別如下:
型別 描述


<scope>
範圍可以是指定提交更改位置的任何內容,如:
- 對 package.json 檔案新增依賴庫,chore(package.json): 新增依賴庫
- 或對程式碼進行重構,refacto(weChat.vue): 重構微信進件

<subject>
如果沒有更合適的範圍,可以直接寫提交內容

 

Commit 實戰
提交一條依賴庫變更,type 為 chore(增加依賴庫);等提交完成後,使用 Git 工具進行搜尋。
此時搜尋型別是 chore(package.json),所以就能知道 package.json 檔案所有的歷史變更。

# 新增一條 Commit 記錄
git commit -m 'chore(package.json): 新增 AngularJS 規範,Commit 時會自動呼叫鉤子(GitHook)來判斷 Message 是否有效'

# 搜尋跟 package.json 檔案相關的歷史記錄
git log HEAD --grep chore(package.json)


3 工具介紹
因為是 Google AngularJS 的標準規範,所以提供了多種工具。如生成 CHANGELOG.md,提
交工具,檢查工具。

工具列表:
1. 提交工具 commitizen,如果是初學者,可以使用 commitizen 幫助我們生成訊息
2. 生成 CHANGELOG.md,把 Git Commit Message 的訊息自動生成 CHANGELOG.md
3. Message 檢查,是否有 “不符合” 規範的內容,可以在 GitHook 中使用

提交以及檢查工具相對來說簡單,大家自學即可,所以我以生成 CHANGELOG.md 舉例

# 安裝 CHANGELOG 生成器
yarn global add standard-version

# 生成文件
standard-version --first-release

文件生成後,當前目錄下就有 CHANGELOG.md 檔案了,如果是 Node 專案,也會自動更新
package.json version 的版本號

這是根據 Git Commit Message 歷史記錄所生成的 CHANGELOG.md,在也不用手寫了。( ̄▽ ̄)"

 

4 參考連結
commitizen
https://github.com/commitizen/cz-cli
https://github.com/conventional-changelog/conventional-changelog
https://github.com/marionebl/commitlint

中文規範
https://github.com/feflow/git-commit-style-guide

AngularJS 規範
https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.greljkmo14y0
https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#toc10

相關文章