我应该多久提交一次源代码管理更改?每个小功能之后,还是仅适用于大型功能?
我正在开展一个项目,并且有一个长期的功能来实现。目前,我正在承诺每一部分工作,即每个子功能实现和错误修复。在发现错误之后我为某些功能添加了一大块测试后,我甚至做出了承诺。
但是,我很担心这种模式。在一个富有成效的工作日里,我可能会做出10次提交。鉴于我正在使用Subversion,这些提交会影响整个存储库,所以我想知道制作这么多确实是一个好习惯吗?
答案 0 :(得分:186)
任何时候我完成对编译和运行的代码的“完整思考”我办理登机手续。这通常最终会在15-60分钟之间。有时它可能会更长,但我总是试图检查是否有很多代码更改,我不想在失败的情况下重写。我通常还会确保我的代码编译完毕,并在回家之前的工作日结束时办理登机手续。
我不担心“太多”提交/签到。当你不得不重写一些东西时,它真的很糟糕,为了以防万一,能够以小的增量回滚是很好的。
答案 1 :(得分:78)
当你说你担心你的“提交会影响整个存储库”时 - 你指的是整个存储库的版本号增加的事实吗?我不知道Subversion使用多少位来存储它,但我很确定你不会用完修订号! 许多提交都不是问题。你可以提交十倍于隔壁的人,你根本不会增加碳足迹。
应该为它的功能命名一个函数或方法,如果名称太长,它就会做得太多。我尝试将相同的规则应用于签到:签到注释应该准确描述更改完成的内容,如果注释太长,我可能会立即改变太多。
答案 2 :(得分:34)
我喜欢杰夫阿特伍德的这篇小文章:Check In Early, Check In Often
答案 3 :(得分:24)
我个人提交完成/稳定/编译的每个逻辑代码组,并且尽量不离开那一天而不提交我当天所做的事情。
答案 4 :(得分:20)
如果您正在进行重大更改并担心影响其他人处理代码,您可以创建一个新分支,然后在更改完成后合并回主干。
答案 5 :(得分:11)
如果你的版本控制评论长于一两句话,你可能不会经常提交。
答案 6 :(得分:11)
答案 7 :(得分:10)
不要提交实际上不起作用的代码。不要将您的存储库用作备份解决方案。
相反,请以自动方式在本地备份不完整的代码。 Time Machine照顾我,并且有很多其他平台的免费程序。
答案 8 :(得分:10)
我遵循开源咒语(释义) - 提前提交,经常提交。
基本上每当我认为我添加了有用的功能(无论多小)而不会给其他团队成员带来问题时。
此提交常用策略在持续集成环境中特别有用,因为它允许针对其他开发工作进行集成测试,从而及早发现问题。
答案 9 :(得分:8)
我使用的经验法则是签到的文件组可以通过单个签到注释覆盖时签到。
这通常是为了确保签到是原子的,并且评论可以很容易被其他开发人员消化。
当您的更改影响具有应用程序范围的配置文件(例如spring上下文文件或struts配置文件)时尤其如此。如果您在签入之前进行了多个“组”更改,则它们的影响会在配置文件中重叠,从而导致两个组相互合并。
答案 10 :(得分:7)
我认为你不应该经常这么担心。这里重要的是什么,何时以及为什么。说你必须每3小时或每24小时提交一次真的没有意义。如果你有事情需要提交,请不要提交。
以下是我recommended best practices for version control的摘录:
[...]如果您同时对项目进行了许多更改,请将它们拆分为逻辑部分并在多个会话中提交它们。这使得跟踪单个更改的历史记录变得更加容易,这将在以后尝试查找和修复错误时节省大量时间。例如,如果要实现功能A,B和C并修复错误1,2和3,则应该总共至少提交六次提交,每个功能一个,每个错误一个。如果您正在处理大型功能或进行大量重构,请考虑将您的工作分成更小的部分,并在每个部分完成后进行提交。此外,在对多个逻辑模块实施独立更改时,请分别对每个模块进行更改,即使它们是更大更改的一部分。
理想情况下,您永远不应该在硬盘上使用未提交的更改离开办公室。如果您正在处理更改会影响其他人的项目,请考虑使用分支来实现更改,并在完成后将它们合并回主干。当提交对其他项目(以及其他人依赖)的库或项目的更改时,请确保不通过提交无法编译的代码来中断其构建。但是,拥有不编译的代码并不是避免提交的借口。改为使用分支。 [...]
答案 11 :(得分:6)
您当前的模式是有道理的。请记住你如何使用这个源代码控制:如果你必须回滚,或者你想做差异怎么办?在这些情况下,您描述的块看起来恰好是正确的差异:差异将显示您在实现bug#(在签入日志中指定)中确切改变了什么,或者确切地说新代码用于实现功能的内容。同样,回滚一次只会触及一件事。
答案 12 :(得分:6)
在完成一大堆工作后,我也想承诺,这通常是一天几次。我认为在小型提交中比在大型提交中看到的更容易。如果您担心过多的提交,可以考虑创建一个分支,并在整个功能完成后将其合并回主干。
答案 13 :(得分:4)
正如其他人所说的那样,尝试提交一个“完整”的逻辑块,使其不会以其他开发者的方式进入(例如,它构建并通过自动化测试)。
每个开发团队/公司必须为每个分支定义“足够完整”的内容。例如,您可能具有仅需要构建代码的功能分支,还需要代码通过自动化测试的主干,以及指示某些内容已通过QA测试的标签......或类似的东西。
我不是说这是一个很好的模式;我只是指出“完成”的工作取决于你团队/公司的政策。
答案 14 :(得分:3)
取决于您的源代码系统以及您拥有的其他内容。如果你正在使用Git,那么只要你完成一个步骤就提交。我使用SVN,当我完成整个功能时,我喜欢提交,因此,每隔一到五个小时。如果我使用CVS,我也会这样做。
答案 15 :(得分:3)
我也想定期入住。那是每次我完成迈向目标的一步。
通常每隔几个小时。
我的困难在于找到愿意并且能够执行如此多的代码审核的人。
我们的公司政策是,在我们检查任何内容之前,我们需要进行代码审查,这是有道理的,但部门中并不总有人有时间立即执行代码审查。可能的解决方案:
答案 16 :(得分:3)
我同意几个回复:不要检查不能编译的代码;如果您担心代码或其更改的“备份”,请使用个人分支机构或存储库;在逻辑单元完成时签入。
我要补充的另一件事是,根据您的环境,登记率可能会随时间而变化。例如,在组件的每个功能部件完成之后检查项目的早期对于安全性和具有修订历史记录都是有意义的(我正在考虑早期位被重构的情况,因为后面的位正在开发中)。另一方面,在项目的后期,完全功能变得更加重要,尤其是在集成开发/测试期间。半整合或半修复对任何人都没有帮助。
至于每个错误修复后的登记:除非修复是微不足道的,绝对是!没有什么比找到一个签入包含三个修复并且其中一个需要回滚更令人痛苦。在这种情况下,开发人员通常会在一个区域中修复三个错误并解除哪个错误修复是一场噩梦。
答案 17 :(得分:3)
你想的那一刻。
(只要您办理入住手续是安全的)
答案 18 :(得分:2)
我喜欢每30-60分钟更改一次,只要它编译得很干净,并且单元测试中没有回归。
答案 19 :(得分:2)
每当你完成一些有效的代码时,如果他们在更新中获得它,就不会搞砸其他人。
请确保您正确评论。
答案 20 :(得分:2)
我仍然相信“经常提交,提早提交”这句话。我更喜欢像Mercurial这样的分散式VCS,并且提交几个东西并将其推向上游没有问题。
这确实是一个常见问题,但真正的问题是:你能提交未完成的代码吗?
答案 21 :(得分:2)
如果你正在处理一个不会被释放的分支,那么提交总是安全的。
但是,如果您与其他开发人员共享它,提交非工作代码可能会有点烦人(特别是如果它在一个重要的地方)。通常情况下,我只提交有效“工作”的代码 - 而不是它已经过全面测试,但我已经确定它实际上是编译而不是立即失败。
如果您正在使用集成的错误跟踪器,如果您修复了两个错误,则执行单独的提交可能会有所帮助,因此提交日志可能会违反正确的错误。但话说回来,有时一个代码更改修复了两个错误,所以你只需要选择哪个代码(除非你的系统允许一个提交与多个错误相关联)
答案 22 :(得分:2)
一方面,您必须在安全性和可恢复性之间取得平衡,另一方面又要便于整个项目的变更管理。
我使用过的最佳方案对这个问题有两个答案。
我们使用了两个完全独立的存储库:一个是项目范围的存储库,另一个是我们自己的个人存储库(我们当时使用的是rcs)。
我们会定期检查我们的个人存储库,几乎每次保存打开的文件。因此,个人存储库基本上是一个很大的,长距离的撤消缓冲区。
一旦我们有一大堆代码可以编译,测试好并且被接受为准备好进行一般使用,它就会被检入项目存储库。
不幸的是,该系统依赖于使用不同的VCS技术。在使用两个相同类型的VCS(例如两个颠覆存储库)时,我没有找到任何令人满意的方法来实现相同的结果
但是,我通过在subversion存储库中创建“个人”开发分支来获得可接受的结果 - 定期检查分支,然后在完成时合并到主干中。
答案 23 :(得分:2)
我没有每次提交的具体时间限制,一旦测试通过,我倾向于提交,我对代码感到满意。我不会提交不编译的代码,或者处于一种状态,以至于在失败的情况下我不会感觉良好恢复
答案 24 :(得分:2)
每天至少一次。
答案 25 :(得分:2)
好吧,你可以拥有自己的分支,你可以随意提交,当你完成你的功能后,你可以将它合并到主干。
关于提交的频率,我想到这一点,如果我的硬盘崩溃并且我没有做出某些事情,对我来说会有多痛苦 - 对我来说,这件事的量是大约2个小时的工作量
当然,我从不提交不能编译的东西。