我为什么要写一个提交消息?


18

我为什么要写一个提交消息?我不想,而且我认为它每次都很愚蠢。

我使用的GUI前端将不具名,它将迫使您执行此操作。即使他们在命令行上使用VCS,我每次都会听到其他人在这样做。

如果我每天提交几次,但是还没有完成功能,那我在写什么呢?我只有在多次提交后才写一条消息,我觉得是时候使用微型标签了,还是当我做一个实际的标签时。

我是对的还是我错过了什么?我也在使用分布式系统


1
不要打扰,只需在评论行中说“等等”。只要您从不与其他任何人共享代码,只要没有其他人可以使用它,并且只要您不需要回滚代码,并且您从未犯过单个代码错误即可...等一下,为什么还要再次使用版本控制?
Michael Durrant 2012年

Answers:


24

对于所有说“只有在您有有用的,经过深思熟虑的消息要编写,并且您的功能已完成100%并且有相应的单元测试时,才承诺”的人,我说:您仍处于SVN思维定势中。

如果您使用的是git,这就是我所说的智能工作流程:

  1. 提交往往你喜欢。在那里写任何旧的快速消息。反正没人会看到它。
  2. 在说了10次提交之后,您就完成了正在使用的功能。现在编写测试并提交这些测试。或您想要的其他任何东西。如果您喜欢TDD,请先编写测试,我不在乎,git也没有。
  3. git rebase -i从您添加的第一个“混乱”提交中,您可以通过挤压,编辑,省略和以其他方式将您的最近历史整理成带有精美消息的逻辑,干净的提交来添加并修复本地历史记录。
  4. 清理后,请某人从您那里拉走。
  5. 冲洗并重复。

请注意,第3步是结束您所需要的提交时,而使用SVN则必须放弃提交,直到完成前两个步骤为止,这是大多数其他答案所建议的。IOW,您不想将半编写的未经测试的代码强加给其他人,因此您无需花一个星期的时间,直到功能完成。您没有充分利用版本控制的潜力。

还要注意,在步骤1和3之间的任何位置,git push如果笔记本电脑的硬盘驱动器死了,您都可以在服务器上对自己的私有存储镜像进行更改,以获得免费的备份。


好答案,我喜欢。我有点害怕使用rebase。这是一篇关于它出错和如何恢复的文章bluemangolearning.com/blog/2009/03/…– 2011

@acid,如果您要基于自己的私人更改,则不应有任何冲突。此外,你必须尝试很难失去在混帐东西。
Alex Budovski

4
我的工作流程,混蛋摇滚
纳兹哥布(Nazgob)2011年

1
@Boris:因为他显然是在谈论git,这显然不是颠覆性的

3
写一句话说明您刚刚所做的事情实际上不应该是一项重要的工作,而用rebase销毁历史似乎是令人讨厌的。假设您在十个提交中的第五个中引入了一个错误,直到一周后才发现该错误。能够将其固定为一个小的提交将对您有很大帮助。
Gort机器人2012年

55

因为当一些可怜的维护者在寻找错误时,发现它是在rev中添加的。xyz,他将想知道什么转速。xyz应该做的。


38
好吧,他可以读我刚刚签到的5,000行意大利面了,JEESH !!!有些人只是懒惰!
爱德华·斯特朗奇

9
因为当可怜的傻瓜在你之后(三年内)来找我,并回顾历史并继续前进... WTF .. WTF .. WTF,他至少会对发生的事情有所了解。您可以轻松添加诸如“例行签入,功能X,不完整”之类的注释。
quick_now 2011年

3
@ acidzombie24:因为每个提交都应该说出它的用途-即使它是“ ..中的错字”,除非您知道修订的目的,否则修订历史没有意义。
2011年

11
@quickly_now,可怜的傻瓜甚至可能是你自己。不幸的是,这是您必须充分体验才能体验到的一件事。

2
@acidzombie-为什么要检查不完整的更改?
爱德华·斯特兰奇

35

您注释了源代码,对吗?

您写的是最好的注释,那些说为什么的注释,因为代码只说了怎么做

提交消息就是这样的注释,因此,它非常重要,并且您对正确处理消息的投入越多,对将来的软件维护者越有用。

对于任何活动的软件,该特定注释最终都将以类似

gitk-所有示例

(位于http://longair.net/blog/2009/04/25/a-few-git-tips/)。这样可以鸟瞰何时开发了该软件,以及他们做了什么

请注意,是提交注释的最终目标,即显示在这样的列表中,向您的未来自己或您的同事说“ 什么 ”,这就是为什么您应该谨慎编写良好的提交消息的原因。


2
@acidzombie,我只能说git,但是您可以在本地执行非常小的步骤,然后在向上游推送时将它们全部组合在一个提交中。 提交消息可以是描述性的。

2
@acidzombie,如果您未进行足够的更改以致无法发表评论,为什么还要提交?请解释。

2
@Thor:因为版本控制可以保护您的代码不丢失,甚至应该保护半完成的代码。
Ben Voigt

1
@Ben,提交是用于长期存储的,应该准确反映工作的“块”。在我看来,防止丢失的保护与版本控制正交,应该由适当的备份系统来处理。我发现Mac版Time Machine非常适合用于此目的-我希望Windows可以使用类似的系统。

2
+1我喜欢不使用无意义的提交来污染源代码控制的人。它使搜索特定的提交变得更容易(通过有用的注释),而且我知道当我签出代码时,它始终处于工作状态。传统的备份软件是在两次提交之间保护我的本地存储库的更好选择。这对于DVCS效果很好,但是您必须记住,本地签入实际上并不是代码的备份。
亚当李尔

15

如果提交消息对您来说很愚蠢,则听起来您使用的提交错误。

提交应该有充分的理由-它们应该与您因使用的功能而分解的任务有关。无论这些任务是正式任务还是仅在您脑海中,您所做的每次更改都应或多或少地完成一项任务,并因此以某种方式起作用。

这样,您的提交消息便可以达到更好的目的。描述您完成的任务,如果未在其他地方跟踪到该任务,为什么需要该任务或该任务的目的:

  • 重构用户类以获得更好的封装
  • 创建了API存根,因此可以在控制器类中使用接口
  • 将数据库类转换为抽象类,以便在测试用例中使用模拟数据库

然后,您或其他开发人员可以浏览存储库或文件的历史记录,并相当容易地看到发生了某些演变的原因以及原因。或者,如果发现某个特定修订版有错误,则提交消息将提供有关插入该行的原因的线索,这样您就不会仅仅撕掉它并可能破坏被认为是错误的内容。修复,您可以改正正确的方法。


1
+1,听起来他犯案的次数太频繁或在错误的停车点。如果他只是想要一个很好的备份点来进行一些实验性更改,则可以使用索引,一个临时分支,修改先前的提交而不是创建新的提交,甚至可以使用编辑器中的撤消缓冲区。
Karl Bielefeldt

1
@Karl:IIRC linus在他的git Google演讲中说,平均每天进行6次提交。现在,我不知道要花多少钱,但是在这个项目上,当我生成接口之后但在序列化工作之前,当我进行了一些反射工作(我对正确的数据进行了循环,对它不做任何事情)时,我现在就提交了。即使我在2小时前有了界面,我现在仍在努力使序列化工作。一旦可行,我将提交并说“反射基础”,但在前三个方面,当我可以轻松查看功能何时“起作用”每x次提交时,为什么还要发表评论。

实际上,我可能会等到进行一些基本测试后再进行测试,因为否则,如果我评论每个提交,我将如何知道其中哪个提交具有稳定的反映?“反射基础”,“反射序列化”,“反射序列化测试”假设序列化必须是第2或第3。测试可以表示单元测试,也可以表示测试是否可以在我需要的基础课上进行。我只是认为当我可以说“反映工作基础”而不是猜测其中哪些实际上意味着基础工作时,发表评论才有意义。当阅读更少时,也更容易浏览/查找。

@acid,提交的全部目的是能够还原到该提交或与之比较更改。如果您以前的提交需要这样做,那么您如何知道选择哪个呢?您不必在这里写小说。我认为“界面工作”,“序列化工作”和“反射工作”都很好。每天的提交次数没有固定的上限,但是如果您的消息显示为“界面上的某些工作”,“界面上的更多工作”,“界面即将完成”,则您提交的次数太多,应该只使用索引。
Karl Bielefeldt

@Karl:指数指数是多少?我知道git有藏身之处,但我不认为您在谈论那件事。它有什么作用?

12

提交评论并不能解决所有问题。他们总是有可能会尽其所能误导他人-尤其是当开发人员为不得不进入而感到生气时。尝试以下操作:将它们视为树林中的面包屑小径,登山路标或示踪子弹。做对了,他们可以勾勒出一条否则令人迷惑的道路。

不要从他们身上赚大钱。说实话:

  • “编辑了空间索引实体,Daos和UI以处理功能X”
  • “针对功能请求#1234和错误#5678的增量签入”
  • “我破坏了上一个版本。这些是我错过的文件。”

保持简短和“大局”。如果可能,请参考功能/错误系统中的问题编号。一些版本控制UI包含用于此类操作的字段。


2
+1表示简短。简短,简单,足够好就可以了。
quick_now 2011年

1
恕我直言,一个更好的指导是通用的“越短越好,越长越好”的配方;因为有时它根本不可能短期保持它在不牺牲重要信息
HVR

11

它减少了WTF /分钟的数量;)

在此处输入图片说明

转化为更快乐的团队(不讨厌您的团队),并可能以更低的成本获得更好的团队产出


4
如果您详细说明为什么如此,我将对此投赞成票。
SingleNegationElimination 2011年

@TokenMacGuy-抱歉,我没有关注。
Rook

1
富有表现力的提交消息如何减少WTF /分钟(确实可以做到)
SingleNegationElimination 2011年

@TokenMacGuy-我认为这很明显。
Rook

9

因此,您团队的其他成员都知道WTF正在检查项目树中的更改。


7
当我是唯一开发人员时,我会为项目添加提交消息!因为当我两年后回来查看这些东西时,我想知道当时的WTF。我非常清楚,在99%的情况下不会看到这种情况。1%的时间可以为我节省2周的痛苦,并且我认为输入10秒提交消息的代价值得我获得长期利益。
quick_now 2011年

@quickly_now,即使是痛苦?是您的代码坏?

1
@quickly_now:赞成。在一两年之内,我就冒出了很多代码,这是几个月后应该做的最后一件事,上帝只知道。上帝,还有我的修订历史。
2011年

哦,是的。我也同意 我认为这是经验==谦卑。
Michael Durrant 2012年

8

因为如果您不练习输入体面的提交消息,您最终会像我的同事一样输入消息

no changes

要么

testing

提交了超过一百个已更改的文件(这里不是在开玩笑!)。

如果您成为这样的开发人员,那么无论您认为输入一条消息多么愚蠢,您在世界其他地方都会看起来很愚蠢。


1
如果我听过,听起来像是提交之前进行同行评审的理想人选。

2
哦,我已经和这类人一起工作了。让我疯狂。
sevenseacat 2011年

4

如果更改没有意义,为什么还要提交?

只需提交有意义的更改即可。例如,前一周我做了相当大的重构,这花了我大约3天的时间。在那段时间内,我会有大量的提交。有些变化很小(“将X类重命名为Y以反映新职责”或“将方法Z()移至Q类”)而其他变化确实很大。完成功能/重构后,我检查是否可以压缩某些提交(至少git支持它,不了解其他工具),但是通常我将其保留下来,因为以后会有所帮助。

我猜您不会在编辑行的中间提交内容,因此它应该具有一定的意义。只需描述您自上次提交以来所做的工作即可。


3

想象一下您通过做出一些更改而破坏系统并在团队几次提交后意识到这一情况的情况。您不记得所做的更改,但是您记得在增强功能X或从模块Y中删除文件时可能出了一些问题。

但是不幸的是,修订号不会告诉您何时更改了X或Y。因此,您可以选择读取最近N天内提交的所有代码,或者仅阅读您编写的详细提交消息(比code更具可读性)。

因此,如果必须这样做,则在提交消息中写入相同,无聊,无用的,无关的文本比提交消息更有害。因为错误的消息没有找到错误的根源,而是会误导您。

因此,每次提交时都尝试编写有意义的提交消息,这对您和维护人员也有帮助。


为什么我应该在每次提交期间而不是一天结束,隔天或完成功能时执行此操作?

1
如果没有“自然”的原因,您为什么经常这样做?

每当我进行一些重大更改时,我都会提交,因此可以反映在存储库中,其他开发人员可以检查这些更改。但是,您给出的答案有助于鸟瞰由谁以及何时完成。
GG01 2011年

@ acidzombie24好吧,除非确实需要,否则不要提交半成品。这样,当您有病的一天打电话给其他人时,其他人可以看到您在做什么/正在做什么。如此一来,您就可以记住当您必须参加2天的会议时您离开的地方。或者,这样您就可以更轻松地确定哪个修订版本破坏了构建并查看了差异。

@Thorbjørn:为什么我不愿意重做更改?

3

如果您正在与其他人一起工作,那么提交消息对于实际查看其他人所做的事情非常重要:查找每个人的差异要花很多时间,而且您可能无法理解为什么有人这样做。如果您与其他人一起工作,而某人(也许不是您)必须回头看,例如,以自始至终的方式跟踪行为自上一版本以来的变化……您确实在不使用有用的提示的情况下使生活变得艰难信息。

如果您是一个人工作...在一个大部分按“原样”编码的项目中(例如,一个简单的网站或脚本),我或多或少都会看到您来自哪里。如果我从事类似的工作,那么我在继续进行某项工作时只关心日期/时间或最近的更改(您有一个还原点,但是这仅在开发过程中重要,在您实施它之后才重要)。版本控制只是进行一些备份的一种方法-我完全同意这并不能完全利用该系统-但是在某些小型项目中可能不需要。

在版本控制以两种不同的方式使用之前,我就想到了这一点,一种是记录项目中的更改,另一种是帮助开发人员就位……这两种完全不同。提交消息在一种方式中非常重要,而在另一种方式中可能几乎没有用。


3

你错过了什么。有必须是用于执行原因提交,否则你不会那样做。

您需要在注释中要做的就是将原因写成文字,即使仅仅是 wip: adding new state objects


究竟。即使(如前所述)只是您“不想重做”的代码,显然这也意味着某些东西,因此编写它的超快速摘要并不难。
sevenseacat 2011年

2

像许多其他人一样,我在业余时间进行一些编码,并使用修订控制系统来跟踪我的开发和变更。我每周有空余的时间差异很大。在很多情况下,我连续几个星期甚至几个月都没有时间在项目上编码,而我通常会花费10分钟(典型的一天)到40分钟(美好的一天)之间的时间。这些条件当然不是很好-特别是对于调试问题。

保留不会丢失且易于检索的笔记至关重要。在每个会话结束时,将通过详细的消息来提交会话的工作。然后,我可以浏览提交历史并跟踪我的进度和思考过程。这使我能够以最少的宝贵时间来回去上周或上个月的位置。

我要说明的一点是,良好的提交消息可以帮助您(以及追随您的其他任何人)弄清发生了什么,发生了什么,发生了什么,最重要的是为什么。


2

从逻辑上考虑一下。当您提交时,这意味着已完成。如果您不留言,其他人将如何知道做了什么?


乍看一下我那难以置信的显而易见的代码,他们将立即知道它所做的一切以及所有通过100%的惊人测试。抱歉,今晚我处于一种幽默的气氛[所以我在嬉戏];)
Michael Durrant

1

如果您不评论自己的提交,那么您可能会想在源代码中评论更改。随着时间的流逝,这可能会使源头变得混乱。


2
我不愿意这样做

1

提交消息是了解该签入内容快速方法,当他们想知道代码的哪个方面在哪个修订版本中有所更改时(可能由于某些原因),它们将对您团队中的其他开发人员有所帮助。

在相关说明中,我建议在提交消息中指定错误跟踪器的案例编号(我希望您使用的是一种),以便将来方便地跟踪事物。


1

这样,一年后该代码的维护者就知道该找谁来寻找那个残酷的代码。:)


这就是blamevcs 的功能所在。
彼得·泰勒
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.