软件重构的版本控制

时间:2010-05-29 17:18:17

标签: version-control refactoring

对大规模重构进行版本控制的最佳方法是什么?

我的典型编程风格(实际上也是编写文档)是尽可能快地获取内容然后重构它。通常,重构与添加其他功能同时发生。除了类和函数的标准重构之外,函数可以从一个文件移动到另一个文件,文件被拆分和合并或只是重新排序。

目前,我正在使用版本控制作为单独的用户,因此在此阶段不存在与其他开发人员交互的问题。不过,版本控制给了我两个方面:

  1. 备份并能够恢复到“以防万一”的好版本。
  2. 查看历史告诉我项目的进展情况和想法的流程。
  3. 我在使用TortoiseHg的Windows上使用mercurial,可以选择帅哥提交。我之所以提到这一点,是因为我希望在重构中提交粒度。我是否应该从提交中始终添加的功能中拆分重构?

    我查看了Refactoring and Source Control: How To?的答案,但它没有回答我的问题。这个问题侧重于与团队的合作。这个集中于具有将来可以理解的历史(假设我不像某些VCS似乎允许的那样重写历史记录)。

6 个答案:

答案 0 :(得分:9)

我认为没有任何一种尺寸适合你回答你的问题:) 就个人而言,我更喜欢在我的提交中保持更精细的敏感粒度:在你的情况下,我会将动作分为两个阶段:每一个独立:

  1. 重构(以及提交后)
  2. 新功能(和提交)。
  3. 最好的办法是自己添加和提交每个项目:打破本地化更改中的重构,逐个提交,然后逐个添加功能,一路提交。

    还有一些开销,但是当你回去寻找差异时,很明显改变了什么是重构以及添加新功能的内容。只回滚一个特定的有问题的添加也更容易。

答案 1 :(得分:3)

  

我是否应该从提交时始终添加的功能中拆分重构?

我倾向于经常办理登机手续;每次签到都是重构或新功能。这是一个循环:

  1. 重构现有代码(不更改其功能)以准备接受新代码
  2. 添加新代码(实现其他功能)。

答案 2 :(得分:2)

我建议将重构与添加功能分开。也许通过交替登记。这是根据我的经验,在我发现uncrustify并重新格式化源文件同时也进行代码更改。很难从重新格式化中找出真正的变化。现在,uncrustify得到了自己的专属提交。

答案 3 :(得分:2)

在处理非常复杂的重构的效果/错误/副作用以及相当广泛的更改之后,我非常强烈建议尽可能多地将两者分开。

如果有任何问题,您可以非常轻松地从与每个阶段相关的标签/标签/版本重新构建代码,并验证这两个问题中的哪一个引入了问题。

此外,尝试以尽可能小的逻辑完整块进行重构,并将它们作为单独的检查点提交。同样,这简化了对什么/什么时候破坏的调查。

答案 4 :(得分:1)

到目前为止,每个答案都建议您将重构与添加功能分开 - 而且我对它们进行了1 + 1。你应该这样做,独立于源代码控制。 Martin Fowler写了一本关于这个概念的全书,你不能同时重构功能。您想知道,对于任何更改,代码应该 在更改之前是否与之后相同。正如@Amardeep指出的那样,如果通过格式化或重构更改隐藏了哪些功能更改,则更难以查看,因此更难以追踪功能更改引入的错误。我并不是说这会阻止你重构或推迟它。一定要经常这样做。但是,从功能变化中单独。微提交是要走的路。

答案 5 :(得分:1)

  • 采取宝宝步骤。进行最小的有用更改,测试,提交和重复。

  • 一次一种变化。不要重构和改变行为 同时。

  • 经常提交。具有清晰,详细描述的微小变化是非常宝贵的。

  • 确保您的自动化测试是可靠且有用的。如果您可以信任您的测试,您可以轻松快速地完成上述任务。

  • 确保测试始终通过

通常我会开始研究新功能或错误修复等等,发现如果我重构这些内容,新功能将更容易添加。通常我会丢弃(或保存在其他地方)到目前为止我的更改,重构/测试/提交,然后返回工作新功能。理想情况下,我花费90%的时间进行重构,每个新功能,错误修复,性能改进等都是简单的单行更改。