软件重构的版本控制

5
什么是大规模重构的最佳版本控制方式?
我的典型编程风格(实际上也适用于撰写文档)是尽快完成一些东西,然后进行重构。通常,在添加其他功能的同时进行重构。除了对类和函数进行标准重构外,函数可能会从一个文件移动到另一个文件,文件被拆分和合并或仅重新排序。
目前,我作为单个用户使用版本控制,因此在此阶段不存在与其他开发人员的交互问题。尽管如此,版本控制仍然给我带来两个方面:
1.备份和能够恢复到好的版本“以防万一”。 2.查看历史记录告诉我项目的进展和思路流程。
我在Windows上使用TortoiseHg使用Mercurial,它使选择要提交的块成为可能。我提到这一点的原因是我想征求有关重构中提交粒度的建议。在提交时,我应该始终将重构与添加的功能分开吗?
我看了重构和源代码控制:如何做?的答案,但它没有回答我的问题。那个问题关注团队合作,而这个问题集中在未来可以理解的历史记录上(假设我不会像某些版本控制系统那样重写历史记录)。
6个回答

9
我认为对于你的问题,没有一种适合所有情况的答案 :) 个人偏向于在我的提交中保持更细致的粒度。针对你的情况,我会将操作分成两个独立的阶段:
  1. 重构(并进行提交)
  2. 新功能(并提交)
最好的做法是将每个项目单独添加并提交:将重构分解为局部更改,并逐一提交它们;逐一添加功能,同时提交它们。
这样做会增加一些工作量,但是这样做时,当你回顾差异时,很清楚哪些是用于重构的更改,哪些是用于添加新功能的更改。这样也更容易回滚出现问题的特定添加部分。

3

我应该把重构和功能添加分开提交吗?

我倾向于频繁检入; 每个检入都是重构或新功能。这是一个循环:

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

2
我建议将重构与添加功能分开。也许可以通过轮流提交来实现。这是我在发现uncrustify并在进行代码更改时重新格式化源文件的经验后得出的结论。很难从只是重新格式化中找出真正的更改。现在,uncrustify有了自己专用的提交。

2

我曾经解决过非常复杂的重构和相当广泛的更改带来的影响/错误/副作用,因此我非常强烈建议在版本控制中尽可能将这两者分开。

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

此外,尝试以尽可能小的逻辑完整块进行重构,并将其作为单独的检查点提交。同样,这简化了调查何时/为什么出错的过程。


1

迄今为止每一个答案都建议您将重构与添加功能分开 - 我+1了所有建议。这是独立于源代码控制的做法。Martin Fowler在一本书中阐述了一个概念:您不能同时进行重构和更改功能。对于任何更改,您需要知道代码在更改前后是否应该确实工作相同。正如@Amardeep所指出的那样,如果由于格式或重构更改而隐藏了功能更改,那么要查找引入的错误就会更加困难。我并不是说要阻止您重构或推迟重构。毫无疑问,经常进行重构。但是要将其功能更改分开。微型提交是正确的方式。


1
  • 小步前进。做最小的有用改变,测试,提交,重复。

  • 一次只更改一种类型。不要同时重构和更改行为。

  • 经常提交。具有清晰、详细描述的小改变是无价之宝。

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

  • 确保您的测试始终通过

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


谢谢。这大致是我目前的工作方式。知道微型提交只有一行或几行代码是良好的行为,这让人感到放心。 - Muhammad Alkarouri
另外两点注意事项:
  1. 由于您正在使用Mercurial,因此有时创建一个新分支来处理一系列相关的小提交,然后将它们合并回父分支是有意义的。
  2. 如果您与团队合作,您希望尽快将更改交到他们手中,反之亦然。良好的测试和小提交有助于实现这一目标。
- Jay Bazuzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接