长期以来,我甚至都不知道编写 git 提交(commit)信息也是有其“最佳实践”的。当我第一次接触 git 时,关于提交信息是这样描述的:“在此,你可以写一些关于此次提交意图的简短信息”。
劣质提交信息
请看下面的提交信息。如果你想合并它们,真心不晓得哪些内容是添加的,哪些是修改的,它们分别做了什么或者你为什么需要这些提交。如果你想在历史记录中搜索某些内容,那么上述的糟糕情况同样会遇到。你向下滚动着提交历史,乌七八糟,简直就是浪费时间。
cd3e27a contact page
aee9d0d comments
eac95e5 list of online users, some other changes because of server
fae5636 little edit
优质提交信息
现在,再看下这些提交信息,是不是感觉好多了?反正我是这么觉得的。
43ec6aa Fix error when the URL is not reachable
4fe84ab Add error message if something went wrong
753aa05 Add server fingerprint check
df3a662 Fix shadow box closing problem
如何编写好的提交信息
一条完整的 commit 信息应该有它的格式——主题、正文以及可选的由已解决/已关闭的问题构成的结语。
主题(Subject)
Git 的 commit 帮助页面对提交信息的主题有个很不错的描述:对变更内容进行总结的单行文本(少于50个字符),后跟一个空行。主题应以大写字母开头且不以句点 . 结尾。而且重要的是,这必须是一个强制的形式。Chris Beams 为此写了一个简单的规则:
Git 提交信息主题的格式应该总是能够符合这样的句式:如果提交被应用,那么这个提交将“……”。比如:
【译注】双引号中的内容替换为你为此次提交所编写的主题,它应该是一个动作。
- 如果被应用,那么这个提交将删除 (Delete) 不需要的文件。
- 如果被应用,那么这个提交将添加 (Add)
grep选项。 - 如果被应用,那么这个提交将修复 (Fix) 协议缺失时错误。
对于坏的提交信息,就不会符合这个句式:
- 如果被应用,那么这个提交将 Contact page。
- 如果被应用,那么这个提交将 list of online users, some other changes because of server。
Git 项目本身就是使用的这种方法。当你要合并某些内容时,Git 会生成一个类似这样的提交信息:"Merge branch...",或者回滚时生成 "Revert..."。
正文(Body)
在正文里你可以编写哪些内容被修改了以及为什么修改。正文的每一行不应超过72个字符。当然了,并不是每次提交都需要有正文信息。
尾行(Bottom line)
最后,你可以添加此次 commit 修复的或相关 issue,这可以是一个链接、数字或者如果你在使用 GitHub,你可以这样写:Resolves #N / Closes #N,这里的 N 表示 issue ID。
示例
这是一条来自我个人仓库的提交信息:
Fix error when protocol is missing
First, it checks if the protocol is set. If not, it changes the url and
add the basic http protocol on the beginning.
Second, it does a "preflight" request and follows all redirects and
returns the last URL. The process then continues with this URL.
Resolves #17
写在最后
感谢你的阅读,希望你从中学到了一些新的东西。如果你有其他的关于如何编写更好的提交消息的提示,或者如何更好地使用此工具,请留下你的评论。
生成变更日志
这样编写提交信息的另一个好处就是很容易生成变更日志。
# show whole commit history
$ git log --oneline --decorate --color
# show history from one tag to another
$ git log 0.0.9..0.0.10 --oneline --decorate --color
# show history form tag to head
git log 0.0.9..HEAD --oneline --decorate --color
这种命令的结果就是你的提交列表。
21629ee Fix getResources bug
aa13384 Update docs
44de44c Add HSTS check
Commitizen
在 GitHub 上有个名叫 Commitizen 的命令行工具,它可以让提交信息的编写变得更加容易。当你想提交的时候,你只需键入 git cz,它会问你一组问题,然后为你创建正确的提交信息。
参考
Git commit manpage
Closing issues using keywords on GitHub
How to Write a Git Commit Message post from Chris Beams