当你说你担心你的"commits affect the whole repository" ---你指的是整个存储库_2721411知道Subversion用来存储它的位数这一事实,但是我不会用完修订版号! Many commits are not a problem. 你可以比隔壁的家伙多十次,你根本不会增加你的碳足迹 .
应该为它的功能命名一个函数或方法,如果名称太长,它就会做得太多 . 我尝试将相同的规则应用于签到: the check-in comment should describe exactly what the change accomplishes, and if the comment is too long, I'm probably changing too much at once.
26 回答
任何时候我完成编译和运行代码的“完整思考”,我办理登机手续 . 这通常最终会在15-60分钟之间 . 有时它可能会更长,但我总是试图检查我是否有很多代码更改,我不想在失败的情况下重写 . 我通常还会确保我的代码编译,并在我回家之前的工作日结束时办理登机手续 .
我不担心做“太多”提交/签到 . 当你必须重写某些内容时,它真的很糟糕,为了以防万一,能够以小的增量回滚是很好的 .
当你说你担心你的"commits affect the whole repository" ---你指的是整个存储库_2721411知道Subversion用来存储它的位数这一事实,但是我不会用完修订版号! Many commits are not a problem. 你可以比隔壁的家伙多十次,你根本不会增加你的碳足迹 .
应该为它的功能命名一个函数或方法,如果名称太长,它就会做得太多 . 我尝试将相同的规则应用于签到: the check-in comment should describe exactly what the change accomplishes, and if the comment is too long, I'm probably changing too much at once.
我喜欢Jeff Atwood的这篇小文章:Check In Early, Check In Often
我个人提交完成/稳定/编译的每个逻辑代码组,尽量不离开那一天而不提交我当天所做的事情 .
如果您正在进行重大更改并担心影响其他人处理代码,则可以创建新分支,然后在更改完成后合并回主干 .
我每次完成任务都会提交 . 通常需要30分钟到1小时 .
如果您的版本控制注释超过一个或两个句子,您可能不会经常提交 .
不要提交实际上不起作用的代码 . 不要将您的存储库用作备份解决方案 .
相反,请以自动方式在本地备份不完整的代码 . Time Machine照顾我,有很多免费程序可供其他平台使用 .
我遵循开源咒语(释义) - 提前提交,经常提交 .
基本上每当我认为我添加了有用的功能(无论多小)而没有为其他团队成员引入问题时 .
这种提交常用策略在持续集成环境中特别有用,因为它允许针对其他开发工作进行集成测试,从而及早发现问题 .
我使用的经验法则是签入的文件组可以通过单个签到注释覆盖时签到 .
这通常是为了确保签到是原子的,并且评论可以被其他开发人员轻松消化 .
当您的更改影响具有应用程序范围的配置文件(例如spring上下文文件或struts配置文件)时尤其如此 . 如果在签入之前进行了多个“组”更改,则它们的影响会在配置文件中重叠,从而导致两个组相互合并 .
我认为你不应该经常这么担心 . 这里重要的是什么,何时以及为什么 . 说你必须每3小时或每24小时提交一次真的没有意义 . 如果你有事情需要提交,请不要 .
这是我的recommended best practices for version control的摘录:
你当前的模式是有道理的 . 请记住如何使用此源代码控件:如果必须回滚,或者如果要进行差异,该怎么办?在这些情况下,您描述的块看起来恰好是正确的差异:差异将显示您在实现bug#(在签入日志中指定)中确切改变了什么,或者确切地说新代码用于实现功能的内容 . 类似地,回滚一次只能触摸一件事 .
在完成一大堆工作后,我也想承诺,这通常是一天几次 . 我认为在小型提交中比在大型提交中看到的更容易 . 如果您担心过多的提交,可以考虑创建一个分支,并在整个功能完成后将其合并回主干 .
这是一篇相关的博文:Coding Horror: Check In Early, Check In Often
正如其他人所说的那样,尝试提交一个足够“完整”的逻辑块,使其不会以其他开发者的方式进入(例如,它构建并通过自动化测试) .
每个开发团队/公司必须为每个分支定义“足够完整”的内容 . 例如,您可能具有仅需要构建代码的功能分支,还需要代码通过自动化测试的主干,以及指示某些内容已通过QA测试的标签......或类似的东西 .
我不是说这是一个很好的模式;我只是指出“完成”的工作取决于你团队/公司的政策 .
你想到它的那一刻 .
(只要您办理入住手续是安全的)
取决于您的源代码系统以及您拥有的其他内容 . 如果你正在使用Git,那么只要你完成一个步骤就提交 . 我使用SVN,我喜欢在完成整个功能时提交,因此,每隔一到五个小时 . 如果我使用CVS,我也会这样做 .
我同意几个回复:不检查无法编译的代码;如果您担心代码或其更改的“备份”,请使用个人分支机构或存储库;在逻辑单元完成时签入 .
我要补充的另一件事是,根据您的环境,登记率可能会随时间而变化 . 例如,在组件的每个功能部件完成之后检查项目的早期对安全性和修订历史记录都是有意义的(我正在考虑早期位被重构的情况,因为后面的位正在开发中) . 另一方面,在项目的后期,完全功能变得更加重要,尤其是在集成开发/测试期间 . 半整合或半修复对任何人都没有帮助 .
至于每个错误修复后的登记:除非修复是微不足道的,绝对!没有什么比找到一个签入包含三个修复并且其中一个需要回滚更令人痛苦的 . 在这种情况下,开发人员通常会在一个区域中修复三个错误并解除哪个更改将导致哪个错误修复是一场噩梦 .
我也想定期入住 . 那是每次我完成迈向目标的一步 .
这是 typically every couple of hours .
我的困难是找到愿意并且能够 perform so many code reviews 的人 .
我们的公司政策是,在我们检查任何内容之前,我们需要进行代码审查,这是有道理的,但部门中并不总有人有时间立即执行代码审查 . 可能的解决方案:
每次办理登机手续的工作量更多;较少签到==较少的评论 .
更改公司签入政策 . 如果我刚刚进行了一些重构并且单元测试全部运行为绿色,那么我可以放宽规则吗?
保留更改,直到有人可以执行审核并继续工作 . 如果评论者不喜欢您的代码而您必须重新设计,这可能会有问题 . 通过'shelving'变化来处理任务的不同阶段会变得混乱 .
我喜欢每30-60分钟进行一次更改,只要它编译干净并且单元测试中没有回归 .
好吧,你可以拥有你自己的分支,你可以随意提交,当你完成你的功能,你可以将它合并到主干 .
在Commits的频率上,我想到这一点,如果我的硬盘崩溃并且我没有做出什么的话,对我来说有多痛苦 - 对我来说,这个东西的量是大约2个小时的工作量 .
当然,我从不提交不能编译的东西 .
至少每天一次 .
我没有每次提交的具体时间限制,我倾向于在测试通过后提交并且我对代码感到满意 . 我不会提交不编译的代码,或者处于一种状态,以至于在发生故障时我不会感觉良好恢复
您必须在安全性和可恢复性之间达成 balancer ,另一方面要便于整个项目的变更管理 .
我使用过的最好的方案对这个问题有两个答案 .
我们使用了两个完全独立的存储库:一个是项目范围的存储库,另一个是我们自己的个人存储库(我们当时使用的是rcs) .
我们会定期检查我们的个人存储库,几乎每次保存打开的文件 . 因此,个人存储库基本上是一个大的,长距离的撤消缓冲区 .
一旦我们有一大堆代码可以编译,测试好并且被接受为准备好进行一般使用,它就会被检入项目存储库 .
不幸的是,该系统依赖于使用不同的VCS技术是可行的 . 在使用两个相同类型的VCS(例如两个颠覆存储库)时,我没有找到任何令人满意的方法来获得相同的结果
但是,我通过在subversion存储库中创建“个人”开发分支来获得可接受的结果 - 定期检查分支,然后在完成时合并到主干 .
如果您正在处理一个不会被释放的分支,则提交始终是安全的 .
但是,如果您与其他开发人员共享它,提交非工作代码可能会有点烦人(特别是如果它在一个重要的地方) . 通常我只提交有效“工作”的代码 - 而不是它已经过全面测试,但我已经确定它实际上是编译而不是立即失败 .
如果您正在使用集成的错误跟踪程序,如果您修复了两个错误,则执行单独的提交可能会有所帮助,这样提交日志就可以抵御正确的错误 . 但话说回来,有时一个代码更改修复了两个错误,所以你只需要选择哪个代码(除非你的系统允许一个提交与多个错误相关联)
我仍然相信短语'commit often, commit early' . 我更喜欢分散的VCS,如Mercurial,并且提交几个东西并将其推送到上游是没有问题的 .
这确实是一个常见的问题,但真正的问题是:你能提交未完成的代码吗?
每当你完成一些有效的代码时,如果他们在更新中得到它,就不会搞砸其他人 .
请确保您正确评论 .