对大规模重构进行版本控制的最佳方法是什么?
我的典型编程风格(实际上也是编写文档)是尽可能快地获取内容然后重构它。通常,重构与添加其他功能同时发生。除了类和函数的标准重构之外,函数可以从一个文件移动到另一个文件,文件被拆分和合并或只是重新排序。
目前,我正在使用版本控制作为单独的用户,因此在此阶段不存在与其他开发人员交互的问题。不过,版本控制给了我两个方面:
我在使用TortoiseHg的Windows上使用mercurial,可以选择帅哥提交。我之所以提到这一点,是因为我希望在重构中提交粒度。我是否应该从提交中始终添加的功能中拆分重构?
我查看了Refactoring and Source Control: How To?的答案,但它没有回答我的问题。这个问题侧重于与团队的合作。这个集中于具有将来可以理解的历史(假设我不像某些VCS似乎允许的那样重写历史记录)。
答案 0 :(得分:9)
我认为没有任何一种尺寸适合你回答你的问题:) 就个人而言,我更喜欢在我的提交中保持更精细的敏感粒度:在你的情况下,我会将动作分为两个阶段:每一个独立:
最好的办法是自己添加和提交每个项目:打破本地化更改中的重构,逐个提交,然后逐个添加功能,一路提交。
还有一些开销,但是当你回去寻找差异时,很明显改变了什么是重构以及添加新功能的内容。只回滚一个特定的有问题的添加也更容易。
答案 1 :(得分:3)
我是否应该从提交时始终添加的功能中拆分重构?
我倾向于经常办理登机手续;每次签到都是重构或新功能。这是一个循环:
答案 2 :(得分:2)
我建议将重构与添加功能分开。也许通过交替登记。这是根据我的经验,在我发现uncrustify并重新格式化源文件同时也进行代码更改。很难从重新格式化中找出真正的变化。现在,uncrustify得到了自己的专属提交。
答案 3 :(得分:2)
在处理非常复杂的重构的效果/错误/副作用以及相当广泛的更改之后,我非常强烈建议尽可能多地将两者分开。
如果有任何问题,您可以非常轻松地从与每个阶段相关的标签/标签/版本重新构建代码,并验证这两个问题中的哪一个引入了问题。
此外,尝试以尽可能小的逻辑完整块进行重构,并将它们作为单独的检查点提交。同样,这简化了对什么/什么时候破坏的调查。
答案 4 :(得分:1)
到目前为止,每个答案都建议您将重构与添加功能分开 - 而且我对它们进行了1 + 1。你应该这样做,独立于源代码控制。 Martin Fowler写了一本关于这个概念的全书,你不能同时重构功能。您想知道,对于任何更改,代码应该和 在更改之前是否与之后相同。正如@Amardeep指出的那样,如果通过格式化或重构更改隐藏了哪些功能更改,则更难以查看,因此更难以追踪功能更改引入的错误。我并不是说这会阻止你重构或推迟它。一定要经常这样做。但是,从功能变化中单独。微提交是要走的路。
答案 5 :(得分:1)
采取宝宝步骤。进行最小的有用更改,测试,提交和重复。
一次一种变化。不要重构和改变行为 同时。
经常提交。具有清晰,详细描述的微小变化是非常宝贵的。
确保您的自动化测试是可靠且有用的。如果您可以信任您的测试,您可以轻松快速地完成上述任务。
确保测试始终通过。
通常我会开始研究新功能或错误修复等等,发现如果我重构这些内容,新功能将更容易添加。通常我会丢弃(或保存在其他地方)到目前为止我的更改,重构/测试/提交,然后返回工作新功能。理想情况下,我花费90%的时间进行重构,每个新功能,错误修复,性能改进等都是简单的单行更改。