如何寫好 Git commit messages


導語:任何軟件項目都是一個協作項目,它至少需要2個開發人員參與,當原始的開發人員將項目開發幾個星期或者幾個月之后,項目步入正規。不過他們或者后續的開發人員仍然需要經常提交一些代碼去修復bug或者實現新的feature。我們經常有這種感受:當一個項目時間過了很久之后,我們對於項目里面的文件和函數功能漸漸淡忘,重新去閱讀熟悉這部分代碼是很浪費時間並且惱人的一件事。但是這也沒法完全避免,我們可以使用一些技巧盡可能減少重新熟悉代碼的時間。commit messages可以滿足需要,它也反映了一個開發人員是否是良好的協作者。

編寫良好的Commit messages可以達到3個重要的目的:

  • 加快review的流程
  • 幫助我們編寫良好的版本發布日志
  • 讓之后的維護者了解代碼里出現特定變化和feature被添加的原因

先來看看一個比較好的例子,感受一下:

下面談談,如何讓項目里面的Commit messages步入規范化,流程化。

Commit messages的基本語法

<type>: <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

Type表示提交類別,Subject表示標題行, Body表示主體描述內容。

Type的類別說明:

  • feat: 添加新特性
  • fix: 修復bug
  • docs: 僅僅修改了文檔
  • style: 僅僅修改了空格、格式縮進、都好等等,不改變代碼邏輯
  • refactor: 代碼重構,沒有加新功能或者修復bug
  • perf: 增加代碼進行性能測試
  • test: 增加測試用例
  • chore: 改變構建流程、或者增加依賴庫、工具等

Commit messages格式要求

# 標題行:50個字符以內,描述主要變更內容
#
# 主體內容:更詳細的說明文本,建議72個字符以內。 需要描述的信息包括:
#
# * 為什么這個變更是必須的? 它可能是用來修復一個bug,增加一個feature,提升性能、可靠性、穩定性等等
# * 他如何解決這個問題? 具體描述解決問題的步驟
# * 是否存在副作用、風險? 
#
# 如果需要的化可以添加一個鏈接到issue地址或者其它文檔

這3個問題給代碼的變更建立了良好的上下文,可以讓其他的代碼review人員或者項目成員直觀的判斷修改點是否正確。一條良好的commit message也可以讓維護者知道這個patch是否適合發布到穩定的版本中去。

如果一個patch沒有回答上面的這幾個問題,那么它是無意義的。它會給review的人員造成負擔,讓他們花費大量時間去評審討論這個patch的作用和意義。更糟糕的是,如果一個項目實施SCM紀律,則這個patch會被拒絕掉,然后開發人員需要花費時間重新編寫一個新的patch。重新編寫一個復雜的patch代價是巨大的,而把commit message寫好只會花費幾分鍾。

Commit messages書寫建議

  • 盡可能多的提交,單個Commit messages包含的內容不要過多
  • 標題行以Fix, Add, Change, Delete開始,采用命令式的模式。不要使用Fixed, Added, Changed等等
  • 始終讓第二行是空白,不寫任何內容
  • 主體內容注意換行,避免在gitk里面滾動條水平滑動
  • 永遠不在 git commit 上增加 -m 或 --message= 參數,提交的時候git commit即可。
  • 如果你是vim用戶,將下面這行代碼加入到~/.vimrc。這會幫助你檢查拼寫和自動換行
    autocmd Filetype gitcommit setlocal spell textwidth=72
    

使用Commitizen工具

Commitizen可以讓你的commit message更加規范統一,適合項目團隊使用,使用也很簡單,使用npm安裝后,提交代碼的時候使用git cz去替代以前的git commit命令即可。

安裝commitizen:

$ npm install -g commitizen

使用截圖:

自動生成Change log

conventional-changelog是用來從git的元數據中生成 Change log文檔的工具,只要你提交的格式滿足它定義的標准,此處以angular標准為例子。使用它生成的Change log包含以下三個部分:

Bug Fixes Bug修復的信息
Features 增加的特性
BREAKING CHANGES 重大變更

可以參考它生成的文檔CHANGELOG.md,使用如下:

$ npm install -g conventional-changelog-cli
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -s

這不會覆蓋你之前的CHANGE.md文檔內容,會在這個文件的最上面插入新生成的日志信息。

參考鏈接

開源信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM