使用 "5W1H" 写出高可读的 Git Commit Message

共 1926 字,读完需 4 分钟。所有工程师都知道,代码是编写一次,修改很多次,然后阅读更多次,代码可读性的重要程度不言而喻,但是在项目演进过程中有个很重要的记录也是会读很多次的,那就是 Git 的提交日志,而提交日志里面信息量最大的应该是 commit message,本文灵感来自 Linux 作者 Linus Torvalds 在 GitHub 上对 commit mesage 的吐槽

Git Log 之痛

在《The Art of Readable Code》这本经典书中,有个形象的比喻,衡量代码可读性的指标是阅读代码时每分钟的 WTF 次数,而在读 Git 提交历史的时候,不知道你有多少次爆粗口?不相信?你现在打开公司演进最快的项目,执行 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 方法去记录,你后来翻看的时候也不会错过细节。

回到正题,Git Log 本质上不也是事件日志么?必然是线上出了问题、产品提出了需求、工程师自己做了重构或技术改进才会导致它的变迁。如果没有详尽记录每次变迁的细节,代码 Review 的人怎么知道你做了什么?上线后遇到问题怎么去追溯?新人接手代码怎么去理解?

解决问题

因为 Git 的特殊性,Git 内核已经能把 5W1H 里面的 who、when 作为 commit 元信息记录下来,而研发活动的 where 明显是不需要记录的,真正需要工程师关注的是 what、why、how,这 3 项重要信息的载体就是 commit message。相信读到这里,你已经明白我想说什么了。

下面提出一种可以帮你写出高可读 commit message 的实践方法,这个方法并非原创,最早的实践来自于这篇文章。简单来说就是要在 commit message 中记录本次提交的 what、why、how,那么怎么把这个想法集成到你的开发工作流里面呢?可以参考下面的步骤来完成:

1. 设置 .gitmessage 模板

这是 Git 内置就支持的,你可以为每次提交的 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

具体的操作过程见下面的动图:

如同阿米尔汗在给他女儿做摔跤战术指导时说的话:拿五分很难,但不是没有可能。习惯的养成定不容易,但是是可行的,如果你认识到这点,离习惯养成已经很近了。

4. 给用 Vim 的同学

为了更好的 commit message 阅读者体验,可能你需要考虑给 commit message 里面的内容自动换行,让内容控制在轻松能看到的宽度之内,使用 Vim 的同学可以在你的 ~/.vimrc 里面增加下面的配置:

autocmd Filetype gitcommit setlocal spell textwidth=80

5. 最重要的是内容

写出高可读的 commit message 需要你对每次提交的改动做认真深入的思考,认真回答上面提到的几个问题:

  • What: 简短的描述这次的改动
  • Why:为什么修改?就是要说明这次改动的必要性,可以是需求来源,任务卡的链接,或者其他相关的资料;
  • How: 做了什么修改?需要说明的是使用了什么方法(比如数据结构、算法)来解决了哪个问题;

此外,还有个非常重要的点就是本次修改的副作用可能有什么,因为工程就是不断在做权衡,本次修改为以后留下了什么坑?还需要什么工作?都可以记录在 commit message 中。

从本质上来说,上面只是你思考问题的框架和记录内容的形式,真正重要的是你要仔细思考的那几个问题,因为一定程度上,commit message 就是文档,活的文档,记录了仓库的所有变迁。

总结

怎么让你的代码可以追溯也是优秀工程师必备的素质,相信读到这里,你对如何写出高可读的 commit message 的原因、好处、方法有了清晰的认识,纸上得来终觉浅,绝知此事要躬行,接下来你就需要把这种方法运用到实际工作中,相信我,你的同事发现之后会开始感激你、效仿你。

One More Thing

本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的掘金专栏知乎专栏:《前端周刊:让你在前端领域跟上时代的脚步》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • git作为时下最流行的代码管理工具,Git权威指南总结了十条喜欢Git的理由: 异地协同工作; 现场版本控制; 重...
    古斟布衣阅读 1,824评论 0 12
  • 本周小结 跑步2次,10km。 读书2本(非技术),读完1本,还有1本在读。 本周主要把时间花在技术上重新理清整个...
    im天行阅读 291评论 0 0
  • 对于执着于追求“去除权威”的人来讲,在自组织团队中,好像仍然常常看到某个“权威”。这里我认为,自组织团队中,每个人...
    BigSpirit阅读 277评论 0 0
  • 清晨的磨山,寂静。刚入大门,一湖看不到边际的荷花。青荷盖绿水,花叶媚清涟。微风中,嫣然摇动。翠绿园荷叶,端...
    天天锻炼吃零食阅读 291评论 1 1