我应该多久对源代码管理进行一次更改?在每个小功能之后,还是仅对于大功能?
我正在做一个项目,并且有一个长期功能要实施。目前,我致力于每一项工作,即实现了每个子功能并修复了一些错误。发现错误后,甚至为某些功能添加了新的测试块后,我什至提交。
但是,我担心这种模式。在富有成效的工作中,我可能会提交10次。鉴于我正在使用Subversion,这些提交会影响整个存储库,所以我想知道这样做是否真的是一个好习惯吗?
我应该多久对源代码管理进行一次更改?在每个小功能之后,还是仅对于大功能?
我正在做一个项目,并且有一个长期功能要实施。目前,我致力于每一项工作,即实现了每个子功能并修复了一些错误。发现错误后,甚至为某些功能添加了新的测试块后,我什至提交。
但是,我担心这种模式。在富有成效的工作中,我可能会提交10次。鉴于我正在使用Subversion,这些提交会影响整个存储库,所以我想知道这样做是否真的是一个好习惯吗?
Answers:
每当我完成编译和运行的代码的“完整思考”时,我都会签入。通常情况下,这通常会持续15-60分钟。有时可能会更长一些,但是我总是尝试检查是否有很多代码更改,如果发生故障我不想重写。我通常还确保我的代码可以编译,并且在工作回家后的一天结束之前签入。
我不会担心进行“过多”的提交/签入。当您必须重写某些内容时,它确实很烂,并且能够以较小的增量进行回滚以防万一,这很好。
不要提交实际上不起作用的代码。不要将您的存储库用作备份解决方案。
而是以自动化方式在本地备份您不完整的代码。Time Machine照顾我,还有许多其他平台的免费程序。
我认为您不必为多久担心一次。这里重要的是什么,何时何地。说必须每3个小时或每24个小时提交一次,这确实没有任何意义。在有东西要提交的时候提交,如果没有,就不要提交。
这是我推荐的版本控制最佳实践的摘录:
[...]如果您要同时对一个项目进行许多更改,请将它们分成逻辑部分,并在多个会话中进行提交。这使跟踪单个更改的历史记录变得更加容易,这将在以后尝试查找和修复错误时为您节省大量时间。例如,如果要实现功能A,B和C并修复错误1、2和3,则总共应至少进行六次提交,每个功能一次,每个错误一次。如果您正在开发大型功能部件或进行大量的重构,请考虑将工作分解为更小的部分,并在完成每个部分后进行提交。同样,在对多个逻辑模块实施独立更改时,即使更改是较大更改的一部分,也要分别将更改提交给每个模块。
理想情况下,永远不要离开办公室,不要在硬盘驱动器上进行任何未提交的更改。如果您正在从事变更会影响其他人的项目,请考虑使用分支来实施您的变更,并在完成后将其合并回主干。在提交对其他项目(也就是其他人)所依赖的库或项目的更改时,请确保不要通过提交不会编译的代码来破坏其构建。但是,拥有无法编译的代码并不是避免提交的借口。请改用分支。[...]
我还喜欢在完成每天通常几次的工作后再提交。我认为,看到小提交比大提交更容易。如果您担心提交过多,可以考虑在整个功能完成后创建一个分支并将其合并回主干。
这是相关的博客文章:编码恐怖:提早入住,经常入住
我同意以下几种回应:不要检入无法编译的代码;如果您关注的是代码或其更改的“备份”,请使用个人分支或存储库;检查逻辑单元何时完成。
我要补充的另一件事是,根据您的环境,入住率可能会随时间而变化。例如,在组件的每个功能部件完成之后的项目检入中,从安全性和具有修订历史的角度来看都是有意义的(我正在考虑在开发较早的位时重构较早的位的情况)。另一方面,在项目的后期,尤其是在集成开发/测试过程中,完全完整的功能变得更加重要。半集成或半修复无法帮助任何人。
至于在每个错误修复之后进行检入:除非该修复是无关紧要的,否则绝对!没有比发现一个检查包含三个修复程序且其中一个需要回滚的修复程序更痛苦的了。在这种情况下,开发人员似乎经常会在一个区域中修复三个错误,并消除将哪个更改转移给哪个错误修复是一场噩梦。
我也喜欢定期检查。那就是我每次都向目标迈出了完整的一步。
这通常是每两个小时。
我的困难是找到一个愿意并且能够执行这么多代码审查的人。
我们的公司政策是,我们需要进行代码审查,然后才能签入任何内容,这是有道理的,但是部门中并不总是有人有时间立即进行代码审查。可能的解决方案:
您一方面必须权衡安全性和可恢复性,另一方面要为整个项目简化变更管理之间的折衷。
我使用的最佳方案对此问题有两个答案。
我们使用了2个完全独立的存储库:一个是项目范围的存储库,另一个是我们自己的个人存储库(当时我们使用rcs)。
每当您保存打开的文件时,我们都会非常有规律地检查我们的个人存储库。因此,个人存储库基本上是一个很大的远程撤消缓冲区。
一旦我们有大量的代码可以编译,测试正常并且被接受为可以普遍使用,就将其检入项目存储库。
不幸的是,该系统只能使用不同的VCS技术。使用两个相同类型的VCS(例如,两个Subversion存储库)时,我没有找到任何令人满意的方法来获得相同的结果
但是,通过在Subversion存储库中创建“个人”开发分支,我获得了可接受的结果-定期检入分支,然后在完成后合并到主干中。
我仍然相信“经常提交,尽早提交”这一短语。我更喜欢像Mercurial这样的分散式VCS,并且可以提交一些东西并将其稍后推向上游没有问题。
这确实是一个常见问题,但真正的问题是:您可以提交未完成的代码吗?
每当您完成一些有效的代码时,如果其他人在更新中得到了帮助,就不会搞砸其他人。
并且请确保您发表正确的评论。