什么时候提交代码?


59

当在项目上工作时,可以在几天或一点点的时间内,以相当快的速度开发代码,并持续数周/月/年。随着代码提交已被视为衡量项目开发的标准,这并不意味着编写的代码要比提交次数少的项目多。

所以问题是什么时候真正对存储库进行提交,以便提交是合理的?

作为附加组件:根据提交的数量来衡量项目的开发是否正确?


9
容易量化的大多数东西都是不好的指标,因为它们过于简单化或容易被打败以针对特定度量表现良好。
unholysampler 2011年

谢谢大家的投入。作出承诺的原因很多,这些承诺分布在答案上,我不能接受多个答案,到目前为止,我接受的票数最高。但是我接受了你所有的答案。

Answers:


79

当您达到要记住的代码库状态时,您将提交。有许多原因可能导致您想记住特定的代码库状态,因此在提交时间方面没有严格的规则。但是,提交次数绝对不能衡量质量或进度。


10
我同意,补遗是行李箱是另外一回事了。例如,为了检查我团队的主干,它必须a)正确构建,并且b)完成一些工作。任何团队成员可以自由虽然创建一个分支,它可以在任何状态,他们想进去。
爱德华奇怪

34

在这种情况下,我喜欢将编码视为攀岩。你爬了一点,然后在岩石上放了一个锚。如果您曾经跌倒,那么您所下的最后一个锚点就是保护您安全的点,因此您跌落的高度永远不会超过几米。与源代码控制相同;您编写了一些代码,当您达到某个稳定的位置时,便提交了一个修订。如果您曾经惨败,您可以随时回到上一个修订版,并且知道它是稳定的。

就是说,如果您在团队中工作,通常要确保所做的任何事情都是完整的,有意义的,干净的构建且不会破坏任何其他人的东西。如果您需要进行较大的更改而可能会干扰其他人的工作,请创建一个分支,以便在不干扰其他任何人的情况下进行提交。

它还取决于您使用的SCM系统。分布式系统通常使合并和分叉变得轻而易举,并且您可以在本地进行提交。这意味着您应该付出很多,并在完成大量工作后进行推送/合并。使用svn或cvs等集中式系统,提交的成本更高,并且会影响到每个人。分支可以部分解决此问题,但是由于它发生在服务器上,因此可能会非常缓慢,并且合并可能很麻烦。因此,对于集中式SCM,通常会有一种更加谨慎的文化,您只有在完成大量工作后才进行提交。

至于附加组件:请不要这样做。代码行,提交次数,发现/解决的错误数等等,都是对质量甚至数量的非常糟糕的衡量。


我认为这同样适用于新分支,其中所有新开发都提交给您自己的分支,然后在功能就绪时将其推送给您?就是 您甚至可能向自己的私有分支提交很多不完整的代码。
Juha Untinen

是的,但是程度较低,因为(请参见原始答案)您不会直接打扰任何人。根据所讨论的SCM,通常最好的做法是在合并上游之前清理提交历史(例如git rebase -i)。
tdammers '16

13

如果您使用的是诸如Mercurial或Git之类的DVCS,则在完成大量工作后就应该提交到本地存储库。但是,只有在它已经过测试,自包含的更改工作之后,才将其推送到共享存储库。

对于非分布式VCS(例如SVN),应用相同的逻辑,而不是使用本地存储库,而是使用私有分支,而不是推送-合并到主分支。


+1感到惊讶,这并没有得到更多支持。那是我的第一个想法-dvc或vcs
Michael Durrant 2012年

9

您应该尽早且经常这样做。

我知道有人每隔90秒就会做出一次承诺。说真的 它似乎为他们工作。我已经尝试过每次保存文件时提交一次,这可能会超过90秒。今天,我大概每15分钟提交一次。一个VCS允许您将多个提交压缩为一个,并允许本地提交(例如git)使此操作变得容易得多。

您应该多久提交一次?很难说,但可能比现在更多。保持越来越频繁的提交,找到一个感觉太荒谬的观点,然后退后一步。您可能会得到一些合理的东西。

您可以根据交付给用户的价值来衡量产品的发展。没有其他准确的测量方法。


1
+1。当您将BDD-如果-如果-您-意味着-结合起来,重构直到丢弃,原子编码和高表达语言时,90秒可能是很长的时间而没有提交。
约尔格W¯¯米塔格

8

提交是任何版本控制的数据/代码的构建块。每次提交应严格执行以下操作之一:

  • 添加新的数据或功能
  • 修复一个或多个错误(如果可能,每个错误提交一次)可以是:
    • 性能改进
    • 纠正错误的代码行为
    • 消除印刷错误
  • 重构代码或数据而无需更改语义。这包括:
    • 重写行为与原始代码相同
    • 将数据表示更改为其他格式
    • 格式化代码或数据以满足项目的格式化准则
  • 合并来自另一个分支的更改(上游/下游)

同样,在分支机构中工作时,提交必须转到更合适的分支机构。两个提交不应具有相同的提交消息(暗示相似的更改),但应位于不同的分支中,因为这会使协作者感到困惑。更好的方法是提交到主分支并合并到功能分支。

如果提交者遵循上述规则,则对以下情况将变得微不足道:

  • 恢复没有副作用的特定更改
  • 从代码格式更改中识别更改代码更改的行为
  • 在不同分支之间合并,避免大多数冲突
  • 与其他开发人员合作,他们可以轻松实现您的更改

关于基于提交来衡量项目的进度,有可能不考虑重构提交和错误修复提交。


我认为该答案必须是公认的答案,但可能发问者正在寻找一个更简单的解释:)
Behnam Rasooli 2016年

7

仅在成功对给定的功能/模块/功能进行单元测试并合理保证已准备好进行集成或系统测试时,才提交。

并回答您的附加问题-不!项目所在位置的度量永远不应由提交的数量决定...谁知道实际提交了什么?它是否已成功通过系统测试或什至是单元测试。仅因为已提交-并不意味着已准备好生产。


5
如果您要提交到主干,那将是正确的,但是如果您要提交到功能分支或私有分支,则无需为集成做好准备。
尼尔·巴特沃思

1
@Neil Butterworth:...除非有其他开发人员在同一个分支上工作且对您的代码有某些依赖性。
FrustratedWithFormsDesigner

@Frustrated在这种情况下,它当然应该是可编译的,但我认为它不必为集成和系统测试做好准备。
尼尔·巴特沃思

1
分布式VC和集中式VC之间有趣的二分法。有了分布式vc,这将永远不会成为一个问题,因为您可以在本地提交功能分支,并避免其他任何开发人员的参与。
乔治·莫尔

2
@乔治-这是错误的二分法。真正的二分法是在使用私有(每个开发人员)分支或使用公共(由多个开发人员共享)之间。这与是否使用集中式分布式VCS是正交的(但是,DVCS鼓励使用私有分支,因为分支从私有开始,直到您发布它们为止)。
Stephen C. Steel

6

作为附加组件:根据提交的数量来衡量项目的开发是否正确?

不。每天都有一个WTF关于为什么这是一个可怕的想法。

我提交代码的一般经验法则是在完成代码块并进行编译时签入。块没有真正定义。如果这是个小任务,我可能要等到完成后才能签到。如果更大,我可能会在每个逻辑部分完成后签入。

但是请不要检查它是否无法编译。我知道大声说出来似乎是愚蠢的事,但是我之前不得不向人们解释过。


1
+1表示编译警告。我们在办公室里有一个存钱罐,每个人每次犯了使建造失败的事情时,都必须付费。可悲的是,我们至少以最初的这种方式获得了很多钱:)
Ray

@Ray-在我的最后一个地方,罚款进入了乐透基金。las,我们从来没有从这个坏习惯中脱颖而出。:P
Tyanna

1

当代码准备好与代码的其他用户共享时(即相对稳定,安全且经过适当测试的情况下),请提交一次提交。

不,我认为提交不是衡量项目开发的重要指标,因为我知道有些开发人员会提交所有微小的更改,而另一些开发人员只会对功能进行重大更改。您如何定量地衡量一项承诺对另一项承诺的价值?


请记住,对于分布式系统,请提交!= share。当您准备好共享内容时,应该进行推送
Rein Henrichs

@Rein Henrichs:好点,尽管这里工作的源代码控件没有该功能(至少据我所知)。提交某些内容后,项目中的其他每个人都可以看到并重新同步(他们通常这样做,有时是盲目地执行)。
FrustratedWithFormsDesigner

这可能表明您可以从更好的工具中受益。防止频繁提交的任何内容都是不必要的障碍。
Rein Henrichs

@Rein Henrichs:我不会争辩!!
FrustratedWithFormsDesigner

1

一旦完成相应的任务。一个任务是一部分用户的故事

在以下情况下完成任务

  • 相应的单元测试合格,
  • 代码已正确记录并
  • 代码已提交。

您可以对done有不同的定义

我看不到衡量提交次数的价值。但是,如果您看到有人长时间处理相同的用户故事(或更糟的是,故事),这就是一种气味。


1

进行所有您认为不会破坏某些事情的重大更改。您唯一不应提交的是样式更改,因为它们没有体现逻辑更改。但是否则,所做的更改越小越好。

提交次数越少,您可以记录思考过程的详细信息越多,这是好的提交日志的一个方面。良好的代码审查不仅应涉及代码结果,还应涉及思考过程。

另外,进行许多小的提交操作很容易将对象一分为二,而版本控制的使用功能却很少使用,这使我节省了很多时间来寻找大海捞针代码库中的针头错误。

简而言之 在当前代码库中发现问题。然后,在更改日志中选择一个提交,以确保特定问题不存在。首先检查出介于“良好”和“不良”版本之间的提交权。测试以查看问题是否仍然存在。如果是这样,则需要往后看,在“良好”和先前测试的提交中间。如果问题不存在,则是在此特定更改之后引入的,因此您需要检查介于“不良”和先前测试的提交之间的中间部分。重复。最终,您将得到导致问题的提交。但是只有当您提交的内容很少时,否则您才知道问题发生在哪些重大更改中。

是它与Git一起工作的方式,但是原理适用于任何版本控制。


在10个先前的答案中所提出和解释的观点上,这似乎没有提供任何实质性的内容。此外,最后一段似乎指的是特定于git的功能,而问题似乎与git不相关
gnat

平分不是特定于git的。它可以与任何类型的版本控制来完成,这是我所知Git有它建立只是一个例子。
碧玉KENNIS

-1

什么时候:

  • 它建立(总是)
  • 单元测试通过
  • 它有效(除非明确标记为“进行中的工作”)
  • 保存代码状态的好处超过了运行测试,考虑良好的提交消息以及解决提交过程中所有合并冲突的麻烦

为此投票是我们的最佳做法。
jersoft
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.