Git Commit Message 到底怎麼寫才優美?
在團隊用 Git 協作中,Commit Message 是很重要的一環,好的 Commit 可以讓我們的專案更容易維護,讓我們更容易了解專案的開發過程,我們可以想像是程式碼的註解,不過是針對專案改動的註解。所以我們想要用這個篇幅來介紹一些寫 Commit 的技巧,讓我們的 Commit 更優美。
那到底甚麼是好的 Commit Message?
1 | fix |
V.S.
1 | fix: login error |
從上方的 Commit 案例中,如果都是一個月前的改動,甚至是一年前的改動,當我今天需要去了解這個改動的時候,我們可以發現第一個 Commit 是很難讓我們了解這個改動的目的,甚至是看不懂要做甚麼,而第二個 Commit 會讓我們更容易了解這個改動的目的,這就是好的 Commit Message 的重要性。
常常軟體工程師中有個迷因 Is it normal if I can’t remember how my code works after just 6 months? 就是,大家回去看自己寫的程式都看不懂,甚至會覺得噁心,因此好的 Commit 可以讓我們更容易了解過去團隊做了甚麼事情,這樣我們就可以更容易地維護專案。
Commit Message 的格式
好的 Commit 應該要能夠一眼看出種類、工作內容的大鋼,更重要的是一致性,這樣我們可以更容易地追蹤開發過程。因此我們可以從以下幾個內容:我們做了甚麼努力(What)、又為什麼要做這件事情(Why)、還有是用什麼方法做到的(How)。
我們可以參考以下的格式:
1 | Header: <TYPE>(<SCOPE>): <SUBJECT> |
Commit Message Header: <TYPE>(<SCOPE>): <SUBJECT>
- TYPE: 代表 commit 的類別,如:feat, fix, docs, style, refactor, test, chore
- (可選)SCOPE:commit 影響的範圍,如:資料庫、控制層、模板層等,視專案不同改變
- (必要)SUBJECT:commit 的簡短描述,不超過 50 個字元,結尾不加句號,盡量讓 Commit 單一化,一次只更動一個主題
Type 的種類
Type 有以下幾種的類別,每個都會是一個動作,代表提交 Commit 的類別,以下是一些我們使用慣例:
- feat: 對專案做了哪些新增、修改 (Feature)。
- fix: 修復了那些功能 (Bug Fix)。
- docs: 對專案撰寫文件 (Documentation)。
- style: 撰寫格式改動 (不影響程式碼運行的變動 white-space, formatting, missing semi colons, et.)。
- refactor: 重構 (既不是新增功能,也不是修補 bug 的程式碼變動)。
- perf: 改善效能 (A code change that improves performance)。
- test: 增加測試 (when adding missing tests)。
- chore: 建構程序或輔助工具的變動 (maintain)。
- revert: 撤銷回覆先前的 commit 例如:revert: type(scope): subject (回覆版本:xxxx)。
Commit Message Body
傳達「我們做了甚麼努力(What)、又為什麼要做這件事情(Why)、還有是用什麼方法做到的(How)」,描述詳細改動的內容,可以分成多行,每行不超過 72 個字元,也可以有前後改動差異的描述。
Commit Message Footer
用來填寫相關聯 issue 的編號,像是 Issue: #1234
。另外還有 BREAKING CHANGE(未必需要),記錄不相容的變動,應該以「BREAKING CHANGE:」開頭,後面是變動的描述、原因和遷移方法。
一些實際的例子
我們在現有的功能上加上了 email 驗證,我們可以使用 feat
來撰寫:
1 | feat: email validation |
今天我們需要基於過去版本做開發,我們可以使用 revert
來回覆先前的 Commit:
1 | revert: feat: email validation |
我們在準備將產品上線的時候,我們駔了幾個 unit test,我們可以使用 test
來撰寫:
1 | test: email validation |
今天我們已經將新功能做好了,我們希望加上文件的說明,我們可以使用 docs
來撰寫:
1 | docs: email validation |
後來因為我們的用戶數量變多了,我們希望優化現有的架構提升驗證速度,我們可以使用 perf
來撰寫:
1 | perf: email validation |
Conclusion
Commit Message 的撰寫會需要大量的練習,也需要時間讓團隊成員去實踐,如此可以讓我們追朔過去的努力,也可以幫助團隊成員更快速地餐與開發過程,這樣我們就可以更容易地維護專案。最後祝大家一切開發都順利,也希望大家的 Commit Message 越來越優美。