使用 "5W1H" 寫出高可讀的 Git Commit Message

共 1926 字疏魏,讀完需 4 分鐘。所有工程師都知道晤愧,代碼是編寫一次大莫,修改很多次,然后閱讀更多次官份,代碼可讀性的重要程度不言而喻葵硕,但是在項目演進過程中有個很重要的記錄也是會讀很多次的眉抬,那就是 Git 的提交日志,而提交日志里面信息量最大的應該是 commit message懈凹,本文靈感來自 Linux 作者 Linus Torvalds 在 GitHub 上對 commit mesage 的吐槽蜀变。

Git Log 之痛

在《The Art of Readable Code》這本經(jīng)典書中,有個形象的比喻介评,衡量代碼可讀性的指標是閱讀代碼時每分鐘的 WTF 次數(shù)库北,而在讀 Git 提交歷史的時候,不知道你有多少次爆粗口们陆?不相信寒瓦?你現(xiàn)在打開公司演進最快的項目,執(zhí)行 git log坪仇,信息量過少甚至是誤導的 commit message 非常常見杂腰,比如:

fix     => 這到底是 fix 什么?為什么 fix椅文?怎么 fix 的喂很?
update  => 更新了什么?是為了解決什么問題皆刺?
test    => 這個最讓人崩潰少辣,難道是為了測試?至于為了測試而去提交一次代碼么羡蛾?

說不定漓帅,你在這種 commit message 中也貢獻了一份力量呢。

正視問題

我們先放下 Git 提交日志來看看典型的后端日志記錄痴怨,如下面這則 access log

remote_addr=[127.0.0.1] http_x_forward=[-] time=[19/Apr/2017:07:28:13 +0800] request=[GET /admin/edu/exam_scores/index/225 HTTP/1.1] status=[200] byte=[15745] elapsed=[0.309] refer=[http://stu.youcaiedu.com/admin/edu/contests] body=[-] ua=[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36] cookie=[JSESSIONID=aaaXlJyT6Ju-K-FbLuWPv; pgv_pvi=7986424832; pgv_si=s905561088; easycms=a16pbumhusksq3vpcogcv2n715; toolbarDisplay=hide; _ga=GA1.2.1604145244.1486802034] gzip=[7.71]

好的 access log 包含了哪些要素呢忙干?

  • 用戶請求的時間(time);
  • 用戶請求的地址(request)浪藻、從何而來(refer)豪直;
  • 用戶來源(remote_addr);
  • 服務端響應(status, byte, elapsed)珠移;
  • ...

回憶下小學的知識,如何準確的描述一次事件末融?對钧惧,就是 5W1H 法則,具體說就是誰(who)在什么時候(when)勾习、什么地點(where)因為什么(why)而做了什么事情(what)浓瞪,他是怎么做的(how),access log 是典型的事件日志巧婶,所以 access log 的記錄完全可以參照 5W1H 方法去記錄乾颁,你后來翻看的時候也不會錯過細節(jié)涂乌。

回到正題,Git Log 本質(zhì)上不也是事件日志么英岭?必然是線上出了問題湾盒、產(chǎn)品提出了需求、工程師自己做了重構或技術改進才會導致它的變遷诅妹。如果沒有詳盡記錄每次變遷的細節(jié)罚勾,代碼 Review 的人怎么知道你做了什么?上線后遇到問題怎么去追溯吭狡?新人接手代碼怎么去理解尖殃?

解決問題

因為 Git 的特殊性,Git 內(nèi)核已經(jīng)能把 5W1H 里面的 who划煮、when 作為 commit 元信息記錄下來送丰,而研發(fā)活動的 where 明顯是不需要記錄的,真正需要工程師關注的是 what弛秋、why器躏、how,這 3 項重要信息的載體就是 commit message铐懊。相信讀到這里邀桑,你已經(jīng)明白我想說什么了。

下面提出一種可以幫你寫出高可讀 commit message 的實踐方法科乎,這個方法并非原創(chuàng)壁畸,最早的實踐來自于這篇文章。簡單來說就是要在 commit message 中記錄本次提交的 what茅茂、why捏萍、how,那么怎么把這個想法集成到你的開發(fā)工作流里面呢空闲?可以參考下面的步驟來完成:

1. 設置 .gitmessage 模板

這是 Git 內(nèi)置就支持的令杈,你可以為每次提交的 commit message 設置一個模板,每次提交的時候都能促使你遵循這個思考的模式去編寫 commit message碴倾,比如下面是我的模板逗噩,存放在 ~/.gitmessage

What: 簡短的描述干了什么

Why:

* 我為什么要這么做?

How:

* 我是怎么做的跌榔?這么做會有什么副作用异雁?

2. 讓模板生效

在全局 Git 配置 ~/.gitconfig 中添加如下配置:

[commit]
  template = ~/.gitmessage

3. 擁抱新模板

配置好模板之后,你要放棄在提交時直接指定 commit message 的習慣做法僧须,即下面這種提交方式:

git commit -m "<commit message here>"

因為這種提交方式是不會彈出模板來讓你填寫的纲刀,你提交的命令應該改成:

git commit

具體的操作過程見下面的動圖:

如同阿米爾汗在給他女兒做摔跤戰(zhàn)術指導時說的話:拿五分很難,但不是沒有可能担平。習慣的養(yǎng)成定不容易示绊,但是是可行的锭部,如果你認識到這點,離習慣養(yǎng)成已經(jīng)很近了面褐。

4. 給用 Vim 的同學

為了更好的 commit message 閱讀者體驗拌禾,可能你需要考慮給 commit message 里面的內(nèi)容自動換行,讓內(nèi)容控制在輕松能看到的寬度之內(nèi)盆耽,使用 Vim 的同學可以在你的 ~/.vimrc 里面增加下面的配置:

autocmd Filetype gitcommit setlocal spell textwidth=80

5. 最重要的是內(nèi)容

寫出高可讀的 commit message 需要你對每次提交的改動做認真深入的思考蹋砚,認真回答上面提到的幾個問題:

  • What: 簡短的描述這次的改動
  • Why:為什么修改?就是要說明這次改動的必要性摄杂,可以是需求來源坝咐,任務卡的鏈接,或者其他相關的資料析恢;
  • How: 做了什么修改墨坚?需要說明的是使用了什么方法(比如數(shù)據(jù)結構、算法)來解決了哪個問題映挂;

此外泽篮,還有個非常重要的點就是本次修改的副作用可能有什么,因為工程就是不斷在做權衡柑船,本次修改為以后留下了什么坑帽撑?還需要什么工作?都可以記錄在 commit message 中鞍时。

從本質(zhì)上來說亏拉,上面只是你思考問題的框架和記錄內(nèi)容的形式,真正重要的是你要仔細思考的那幾個問題逆巍,因為一定程度上及塘,commit message 就是文檔,活的文檔锐极,記錄了倉庫的所有變遷笙僚。

總結

怎么讓你的代碼可以追溯也是優(yōu)秀工程師必備的素質(zhì),相信讀到這里灵再,你對如何寫出高可讀的 commit message 的原因肋层、好處、方法有了清晰的認識翎迁,紙上得來終覺淺栋猖,絕知此事要躬行,接下來你就需要把這種方法運用到實際工作中鸳兽,相信我,你的同事發(fā)現(xiàn)之后會開始感激你罕拂、效仿你揍异。

One More Thing

本文作者王仕軍全陨,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處衷掷。如果你覺得本文對你有幫助辱姨,請點贊!如果對文中的內(nèi)容有任何疑問戚嗅,歡迎留言討論雨涛。想知道我接下來會寫些什么?歡迎訂閱我的掘金專欄知乎專欄:《前端周刊:讓你在前端領域跟上時代的腳步》懦胞。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末替久,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躏尉,更是在濱河造成了極大的恐慌蚯根,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胀糜,死亡現(xiàn)場離奇詭異颅拦,居然都是意外死亡,警方通過查閱死者的電腦和手機教藻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門距帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人括堤,你說我怎么就攤上這事碌秸。” “怎么了痊臭?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵哮肚,是天一觀的道長。 經(jīng)常有香客問我广匙,道長允趟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任鸦致,我火速辦了婚禮潮剪,結果婚禮上,老公的妹妹穿的比我還像新娘分唾。我一直安慰自己抗碰,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布绽乔。 她就那樣靜靜地躺著弧蝇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上看疗,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天沙峻,我揣著相機與錄音,去河邊找鬼两芳。 笑死摔寨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的怖辆。 我是一名探鬼主播是复,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼竖螃!你這毒婦竟也來了哼御?” 一聲冷哼從身側響起箫荡,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤柑营,失蹤者是張志新(化名)和其女友劉穎萤彩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坚弱,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蜀备,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒叶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碾阁。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖些楣,靈堂內(nèi)的尸體忽然破棺而出脂凶,到底是詐尸還是另有隱情,我是刑警寧澤愁茁,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布蚕钦,位于F島的核電站,受9級特大地震影響鹅很,放射性物質(zhì)發(fā)生泄漏嘶居。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一促煮、第九天 我趴在偏房一處隱蔽的房頂上張望邮屁。 院中可真熱鬧,春花似錦菠齿、人聲如沸佑吝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芋忿。三九已至炸客,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戈钢,已是汗流浹背嚷量。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逆趣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓嗜历,卻偏偏與公主長得像宣渗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梨州,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理痕囱,服務發(fā)現(xiàn),斷路器暴匠,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • git作為時下最流行的代碼管理工具鞍恢,Git權威指南總結了十條喜歡Git的理由: 異地協(xié)同工作; 現(xiàn)場版本控制每窖; 重...
    古斟布衣閱讀 1,818評論 0 12
  • 本周小結 跑步2次帮掉,10km。 讀書2本(非技術)窒典,讀完1本蟆炊,還有1本在讀。 本周主要把時間花在技術上重新理清整個...
    im天行閱讀 286評論 0 0
  • 對于執(zhí)著于追求“去除權威”的人來講,在自組織團隊中劈猪,好像仍然常趁粮剩看到某個“權威”。這里我認為战得,自組織團隊中充边,每個人...
    BigSpirit閱讀 273評論 0 0
  • 清晨的磨山,寂靜贡避。剛入大門痛黎,一湖看不到邊際的荷花。青荷蓋綠水刮吧,花葉媚清漣湖饱。微風中,嫣然搖動杀捻。翠綠園荷葉井厌,端...
    天天鍛煉吃零食閱讀 285評論 1 1