我应该在git commit消息中使用过去时还是现在时?[关闭]


530

读过一次 git commit消息应该使用命令式现在时,例如“为x添加测试”。我总是发现自己使用过去时,例如“为x添加测试”,这对我来说自然而然。

这是John Resig最近提交的内容,其中显示了两个消息:

在操作测试中调整更多jQuery设置结果。还确定了预期测试结果的顺序。

有关系吗?我应该使用哪个?


12
因此,这个问题需要以主要基于意见的观点来结束。只需看看命令式过去式之间的观点差异即可!话虽这么说,我投票赞成命令式时态,因为它确实有助于阐明您在重写历史记录,挑选信息,应用补丁程序时正在做什么!




3
@Eonil如果因在这里发表意见而被关闭,在那儿也将被拒绝发表意见。
棘轮怪胎

Answers:


600

当前时态,命令式提交消息的偏好来自Git本身。从Git存储库中的Documentation / SubmittingPatchs

描述您在命令式情绪中的更改,例如,“使xyzzy做frotz”而不是“ [此补丁]使xyzzy做frotz”或“ [I]将xyzzy做frotz”,就好像您是在向代码库发出更改其命令的命令一样行为。

因此,您会看到很多以这种风格编写的Git提交消息。如果您在团队或开源软件上工作,那么每个人都坚持那种风格以保持一致性会很有帮助。即使您正在从事一个私人项目,并且您是唯一会看到git历史的人,使用命令式心情还是有帮助的,因为它会养成良好的习惯,与他人合作时会受到赞赏。


89
我认为这是一个绝佳的选择。考虑一下diff形式的提交是什么:一组有关如何从先前状态转到新状态的指令。就像差异显示“在此添加此行,在此删除此行”一样,提交消息用定性术语说“进行此更改”。(是的,git确实只是将提交存储为带有元数据的树,但是对于人类来说,提交的重要部分是差异。)
Cascabel 2010年

124
您可能会看到一次提交是一组有关如何从先前状态转到新状态的说明;但我将其更多地看作是代码演变过程中的一个检查点。对我来说,提交消息是自上次提交以来对代码所做的记录。对于日志来说,过去式更有意义。如果您真的认为提交消息应该是一组指令,那么当务之急是您要走的路。我只是真的不这么认为。
karadoc 2012年

10
@oschrenk:该文件的更高版本给出了一个原因:“描述您在命令式情绪中的更改,例如,“使xyzzy做frotz”而不是“ [此补丁]使xyzzy做frotz”或“ [I]将xyzzy更改为frotz” ”,就好像您正在命令代码库更改其行为一样。”
mipadi

44
提交消息必须是强制性的,必须使用现在时态,因为使用git可能会使您或其他人最终这样做,rebase或者cherry-pick在这种情况下,可以在其原始上下文之外使用提交。结果,提交消息应独立编写,而不希望读者查看任何周围的提交消息。当您挑选补丁时,应用“修复快速排序算法”或“排序:提高性能”而不是“修复错误#124”或“修改排序以提高性能”更有意义。
Mikko Rantalainen

5
我对此的想法是,该消息应告诉我,如果我选择将此提交应用于我的分支,将会发生什么变化。我不认为它是日志,而是可以移动的状态,我需要知道选择特定状态时会发生什么。
steinybot

357

您的项目几乎应该总是使用过去时。无论如何,项目应始终使用相同的时态以保持一致性和清晰度。

我理解其他一些争论使用当前时态的论点,但它们通常不适用。以下要点是目前时态写作的常见论点,以及我的回答。

  • 使用现在时书写可以告诉某人应用提交将执行的操作,而不是您执行的操作。

这是要使用现在时的最正确的理由,但只能使用正确的项目样式。这种思维方式将所有提交视为可选的改进或功能,您可以自由决定在特定存储库中保留哪些提交以及拒绝哪些提交。

如果您要处理的是真正的分布式项目,则此参数有效。如果要处理分布式项目,则可能正在开发一个开源项目。如果它真的是分布式的,那可能是一个非常大的项目。实际上,它可能是Linux内核或Git。由于Linux可能是导致Git传播并获得普及的原因,因此很容易理解为什么人们会认为它的风格是权威。是的,这两个项目的风格有意义。或者,通常,它可与大型的开源分布式项目一起使用。

话虽这么说,大多数源代码控制项目都不是这样。对于大多数存储库,这通常是不正确的。这是一种关于提交的现代思考方式:Subversion(SVN)和CVS存储库几乎无法支持这种类型的存储库签入。通常,集成分支会处理对不良签入的过滤,但通常不将其视为“可选”或“必备功能”。

在大多数情况下,当您提交到源存储库时,您正在编写日记条目,该日记条目描述了此更新的更改,以使将来的其他人员更容易理解更改原因。通常这不是可选的更改-项目中的其他人员必须合并或基于此更改。你不写日记,如“亲爱的日记,今天我满足一个男孩和他我打招呼。”,而是你写“我遇到了一个男孩,他我打招呼。”

最后,对于此类非分布式项目,一个人阅读提交消息的时间的99.99%是用于阅读历史记录的-历史记录以过去时态阅读。0.01%的时间将决定他们是否应该应用此提交或将其集成到其分支机构/存储库中。

  • 一致性。在许多项目中就是这样(包括git本身)。生成提交的git工具(例如git merge或git revert)也可以做到这一点。

不,我向您保证,曾经登录版本控制系统的大多数项目都具有过去时的历史记录(我没有引用,但考虑到当前时态参数自Git之后才是新的,这可能是对的)。以当前时态显示的“修订”消息或提交消息仅在真正分布的项目中才有意义-参见上面的第一点。

  • 人们不仅可以阅读历史记录来了解“此代码库发生了什么”,而且还可以回答诸如“当我选择该提交时发生了什么”或“由于这些提交将在我的代码库中发生什么新事物”之类的问题。我将来可能会合并,也可能不会合并”。

参见第一点。一个人将阅读提交消息的99.99%的时间用于阅读历史记录-历史记录以过去时态阅读。0.01%的时间将决定他们是否应该应用此提交或将其集成到其分支机构/存储库中。99.99%胜过0.01%

  • 通常比较短

我从来没有见过一个很好的说法,说使用不正确的时态/语法,因为它更短。对于标准的50个字符的消息,您平均可能只保存3个字符。话虽如此,现在的平均时态可能会短几个字符。

  • 您可以在问题/功能跟踪器中与工单标题更一致地命名提交(不使用过去式,尽管有时是将来)

票证可以写为当前正在发生的事情(例如,当我单击此按钮时应用程序显示错误的行为),或者将来需要做的事情(例如,文本需要编辑人员审阅)。

历史记录(即提交消息)被写为过去所做的事情(例如,问题解决)。


79
我今天第一次听说有关命令式样式提交的假定偏爱。对我来说,这听起来太不自然和怪异,以至于我决定寻求更多意见。我很高兴看到我不是唯一认为过去式对于提交消息更自然的人。:)
karadoc

56
git自动生成的merge和rebase提交消息是必须的,并且必须使用时态(“ Merge”,而不是“ Merged”;“ Rebase”,而不是“ Rebased”),因此您可能希望在自己的提交消息中将其匹配以保持一致性。
mjs 2013年

13
似乎区别在于侧重于软件更改-“通过Y固定X”或存储库 -“ Y修复X”。+1是一个很好的论据,但我认为回购协议通常应该专注于自身而不是最终的软件。
l0b0

28
问题是,使用命令式时态,现在时态适用于大型项目(例如Linux),因此显然可以扩展。此外,使用过去时几乎需要零工作量。结果,除了强制性的现在时态之外,我没有其他理由(除了“老人习惯于以过去时态编写提交消息”)。如果您可以学习git命令集,则可以学习命令式现在时的写作。
Mikko Rantalainen

35
命令不是“自git以来的新功能”。ChangeLog在git之前就已经存在了,在GNU工程中,推荐使用命令式命令。 gnu.org/prep/standards/html_node/Style-of-Change-Logs.html
ADL

81

我在365git上写了更完整的描述。

祈使现在时的用法是需要一点时间来习惯的。当我开始提到它时,它遇到了阻力。通常按照“提交消息记录我所做的事情”的思路。但是,Git是一个分布式版本控制系统,可能有很多地方可以进行更改。而不是写说明您所做的事情的消息;将这些消息视为执行提交操作的说明。而不是提交标题:

Renamed the iVars and removed the common prefix.

有一个这样的:

Rename the iVars to remove the common prefix

哪个告诉某人应用提交将做什么,而不是您做了什么。另外,如果查看存储库历史记录,您还将看到Git生成的消息也以这种时态编写-“合并”而不是“合并”,“变基”不是“变基”,因此以相同的时态进行书写可使内容保持一致。一开始感觉很奇怪,但是确实有意义(可以在申请时提供证明),并最终变得自然。

说了这么多-这是您的代码,即您的存储库:因此,请设置您自己的准则并坚持使用。

但是,如果您确实决定采用这种方式,那么git rebase -i使用reword选项将是一件好事。


7
好吧,您混淆了两个不同的准则:Git开源项目和Git的常规用法。提供的链接根本没有提到时态。官方的Git文档只提到了50个字符的限制。 Git是一个分布式VCS,在这里有很多地方可以进行更改...将这些消息视为应用提交将执行的操作的说明。 这仅适用于少数几个实际为分布式项目的项目。99.999%的Git提交将永远不会以这种方式手动应用。在大多数项目中,历史记录是一个更改日志,应该以过去时表示。
马特·奎格利

4
“并且应该跳过句号”
2013年

30

坚持现在时

  • 有一个标准是很好的
  • 它与错误跟踪器中的票证相匹配,这些票证自然具有“实现某些东西”,“修复某些东西”或“测试某些东西”的形式。

16

您是为谁写消息的?那个读者通常是在拥有所有权之前或之后阅读消息吗?

我认为在这两个方面都给出了很好的答案,也许我只是建议每个项目都没有最好的答案。分割表决可能会提出同样的建议。

即总结一下:

  • 该信息主要是给其他人的,通常是在他们接受更改之前的某个时候阅读:关于更改将对他们现有代码产生影响的建议。

  • 该消息主要是作为发送给您自己(或您的团队)的日记/记录的信息,但通常是从假设更改并进行搜索以发现发生的情况的角度进行阅读。

也许这两种方式都会带动您的团队/项目的动力。


10

有关系吗?人们通常足够聪明,可以正确地解释消息,如果不是,那么您可能就不应该让他们访问您的存储库!


27
对于某些人来说,类似的事情相当重要。
Wesley Murch

2
@mog链接不对当前和过去做任何声明。
2013年

2
如果该项目确实花费大量时间,那么进行代码审查和错误查找的人员将看到大量提交,因此他们需要您和我提供的所有帮助。现在没有必要节省几秒钟的时间,以免将来由于未编写正确的提交消息而引起严重的头痛。
Mikko Rantalainen

我并不是说不要写一个好的提交信息。我是说您使用过去式还是现在式都没关系。
迈克尔·巴尔德里

1
您怎么知道该人无法解释您的提交消息,是由于该人能力不足或您没有能力编写好的提交消息?
哈里斯

7

它是由你决定。只需根据需要使用提交消息即可。但是,如果不在时间和语言之间切换,会更容易。

如果您是团队成员,则应进行讨论并确定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.