解决由于重构引起的合并冲突


13

最近,我参与了有关如何处理重构的讨论(这本身就是一个有趣的话题)。最终提出了以下问题:

一个人如何处理由于某人对一部分代码进行重构而其他人在为同一段代码开发功能时发生的合并冲突呢?

基本上,我不知道如何有效地处理这一问题。在这方面是否应遵循任何最佳做法?对于具有大量旧代码的系统,应该如何处理呢?


我有一个类似的问题,但是有不同的要求,所以我添加了另一个问题。programmers.stackexchange.com/questions/109229/...
罗杰CS Wernersson

Answers:


9

好问题。我能想到的最佳策略是:

预防

持续集成和经常进行少量重构(而不是偶尔进行大量重构)的结合将大大减少此类冲突的成本和频率。


3

我想回答您的问题,首先我们必须了解为什么会发生冲突,合并的真正含义和过程是什么?

冲突只有当两个或多个开发人员在工作发生相同的文件同一时间,然后他们都试图检查。第一个开发者不会得到任何冲突,当然。但是第二个(第三,第四等等)会发生冲突。为什么,因为他的某些代码与服务器上的现有代码部分或完全不同。

本质上,这意味着第二位开发人员与第一位开发人员的想法有所不同。这种差异可能会因样式不同而有所不同,例如使用new UserManager().GetUserName()而不是使用UserManager userManager = new UserManager(); userManager.GetUserName();您提到的级别,这意味着两个开发人员对于如何重构代码进行改进都有不同的想法。

另一方面,合并并不意味着开发人员可以在不考虑冲突的情况下检入其代码。他们应该而且必须解决这些冲突。如果冲突不重要,则它们可以签入并覆盖以前的代码。但是,当他们看到完全不同的事物时,应该致电前一位开发人员,并与他交谈,以便他们可以相互协调,以签入最佳解决方案。

例如,如果您要求两个开发人员改进在线支付库,并且他们的工作重叠,这意味着至少在某些地方,有2种不同的解决方案。因此,应该讨论并接受其中一种解决方案,作为更好的解决方案。

我不同意防止出现这种情况,因为我们应该比理论上更加真实。有时候,一个人真的很擅长CSS,而另一个人真的很擅长ASP.NET Markup。但是当他们俩都应该在登录页面上进行工作时,他们的工作可能会发生冲突。我的意思是,如果我们认为真实的(不理想的),我们可以看到很多次发生这种现象(冲突)。

我只想提及的另一点是,使用工具来帮助您办理入住手续。这些工具通常可视化服务器代码和开发人员代码的区别,并在确定应检入哪个部分方面有很大帮助。


3

如果没有积极的任务管理,那么您就有冲突。

但是,如果您每天有一个站立会议或一位经理,则不可能出现此问题。

谈话(通过每天站起来)或与经理谈话。

说话可以避免这种情况。


+1。一些开发人员将经理视为障碍。但是,经理的确存在是为了使其他人能够工作,这是他们可以帮助解决的一个很好的例子。
MarkJ 2011年

@MarkJ:成为合并冲突障碍的经理并不是一件坏事。优点。
S.Lott

+1我正要在我的答案中添加类似的内容,但您已将其钉牢。如果您使用冲突来告知其他人正在同一地区工作,那么您将在游戏中发现很晚,然后必须对其进行处理。任务管理和通信可以使在同一区域工作的开发人员从一开始就可以一起工作。
吉安(Gyan)加里·布恩(Gary Buyn)2011年

1

有一个单独的通用分支来开发某个功能,经常合并/拉动/推动-就是这样。

沟通。即使启动,也要与其他开发人员讨论代码。即使编码)))


1

确保合并尽可能简单。重构通常是一个相当机械的过程,它会改变许多现有的行:移动变量声明,空格更改,格式设置,操作顺序。创建功能通常是一项更具创造力的冒险,通常会产生新代码,并对现有代码进行一些细微调整。现在,如果进行重构的开发人员记录了这些步骤(例如,作为正则表达式),则可以通过附加功能将这些步骤应用于代码,而不是采用其他方法。基于此,我想说,一般来说,应该首先应用最复杂的更改,然后再逐步进行更简单的更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.