當前位置:
首頁 > 知識 > Git 最佳實踐:commit msg

Git 最佳實踐:commit msg

點擊上方「

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!






1.引言




git commit 是很小的一件事情,但是往往小的事情往往引不起大家的關注,不妨打開公司的 gitlab 上的任一個 repo,查看 commit log,滿篇的 update 和 fix,完全不知道這些 commit 是要做啥。下面就說一些最近的看到和自己嘗試的一些還不錯的實踐。




2. Tips




1. one thing one commit




在提交 commit 的時候盡量保證這個 commit 只做一件事情,比如實現某個功能或者修改了配置文件。




1.易讀



閱讀整個項目代碼的時候有時候整個項目通讀並不是一個好的方法。我們可以通過 issue 或者 commit 來一點一點分解整個 repo。如果一個 commit 只聚焦在一個點上,那麼代碼看起來也會比較舒服,順著 commit 讀下來就是當初的開發過程了。




2.cherry-pick



cherry-pick 是 git 中的一個非常有用的命令,可以將 commit 從一個分支「拷貝」到另一個分支。如果我的 commit 劃分都很清楚,那麼 cherry-pick 就會比較輕鬆。但是如果我的一個 commit 即實現了功能A,又實現了功能B,而我只想要功能A,這就很尷尬了。




也許有人會說怎麼會有這麼奇葩的需求,那麼我說一個我剛遇到的例子。我現在負責一些底層的服務,上游的服務會對我有依賴。我對自己的服務有個排期,上游的服務有個排期,而且我目前做了一些介面的升級並不在上游服務的緊接著的下一次上線排期中。目前我的所有開發都是在 dev 分支,為了配合上游服務上線,我需要上線 dev 分支上的部分功能。這個時候只能從 master 上新開一個分支,然後把 dev 分支上和上游服務相關的 commit 「拷貝」過去,也就是 cherry-pick。這個時候就可能遇到上面說的那種尷尬的情況。



3. code review



review 過別人代碼的人都知道如果 commit 亂七八糟那將有多麼痛苦。我曾經給 githug 項目(一個 ruby 寫的練習 git 的終端小遊戲)提交 pr 的時候,一個 pr 包含了三個 commit,其中有兩個 commit 是修改拼寫錯誤,然後 repo 的作者讓我把 commit 合併為一個,才答應給我 merge。




2. thoughtbot 規範




地址:https://github.com/thoughtbot/dotfiles/blob/master/gitmessage





# 50-character subject line

#


# 72-character wrapped longer description. This should answer:


#


# * Why was this change necessary?


# * How does it address the problem?

# * Are there any side effects?


#


# Include a link to the ticket, if any.




關於這個規範更詳細的說明可以參考他們的一篇文章 5 Useful Tips For A Better Commit Message 。簡單來說:





  1. 第一行不超過 50 個字元



  2. 第二行空一行



  3. 第三行開始是描述信息,每行長度不超過 72 個字元,超過了自己換行。



  4. 描述信息主要說明:




    1. 這個改動為什麼是必要的?



    2. 這個改動解決了什麼問題?



    3. 會影響到哪些其他的代碼?



  5. 最後最好有一個相應 ticket 的鏈接




Commit 這種格式有點類似郵件,主題不超過50個字元,然後空一行,這樣顯示的下面的部分都會摺疊起來,類似下面的樣子。我們使用命令 git log --oneline的時候就只顯示第一行。



正文部分不超過 72 個字元,這個也主要是為了閱讀方便。




關於最後的一個 ticket 的說明。我們開發之前需要將所有的功能進行拆解,然後開發過程中需要通過一些工具來 track ,每個小功能就是一個 ticket。有些公司使用 jira,有些公司使用 wiki。以使用 jira 為例,前面把功能拆解之後分到每個人手上。這樣我們進行提交的時候附上對於的 ticket 鏈接或者 ticket 號,之後再回溯的時候就會非常方便了。或者也可以給 jira 開發插件,通過抓取 git commit 信息進行分析就能將相應的改動代碼直接展示在 jira 上了。這麼做的好處不言而喻,需求-功能-開發-代碼,整個都被串起來了,不管是對於新人了解系統還是5年或者10年之後回溯都是非常有幫助的。




下面看一個我們項目中不同風格的 commit 截圖對比。







3. 示例




我們不妨看看開源社區的 git commit 規範。




1.AngularJS




地址:AngularJS Git Commit Message Conventions 。commit msg 包括三部分:header, body, footer。




1. commit msg format


1. revert



如果這個commit revert 了別的 commit,那麼它的 header 應該以 「revert:」開始,後面跟上被 revert 的 commit 的標題。body 應該是 This reverts commit <hash>.




2. header



header 應該包括 type,分隔符,主題




type 主要包括:






  • feat (feature)



  • fix (bug fix)



  • docs (documentation)



  • style (formating, missing semi colons, …)



  • refactor



  • test (when adding missing tests)



  • chore (maintain)




主題信息能夠簡短地描述你的 commit 即可,結尾不要使用「.」,開頭首字母不要大寫。使用祈使語態,比如使用 change,而不是 changed




3.msg body



除了 header 的主題信息的要求外,還需要包括為什麼要做這個 commit,以及改動前後的對比。




4.footer





  • Breaking changes: 重要的改動要聲明。(其實我覺得這個放在header裡面更好)



  • Referencing issues: 如果和 issue 相關,指出來。




2. Example





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 #392


Breaks foo.bar api, foo.baz should be used instead






  • 來源:伯樂在線 - legendtkl




  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

Python 函數式編程入門教程
用Python從零開始創建區塊鏈

TAG:Python開發 |