Mar*_*ris 11 version-control merge
我最近一直在研究大型代码库,重构并通常改进设计以增加覆盖范围.此外,在相当多的文件中,我删除了多余的使用语句,移动了方法,以便类似的功能靠得很近,添加了区域等,但实际上没有改变文件中代码的功能.
与此同时,在团队的其他地方,其他开发人员正在修复错误并改变代码行.显然,当涉及到合并时,这可能是一个问题,因为行号不再匹配,方法可能已经移动.
现在,我理解一般规则,在源控制环境中移动方法可能是危险的,我们认为这个好处超过了成本.然而,我不明白为什么它应该是这样的.
假设我的初始文件是一个简单的计算器:
public class Calculator
{
public int Subtract(int a, int b)
{
return a + b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
我决定我希望这些方法按字母顺序排列:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
而另一位开发人员修复了减法方法中的错误
public class Calculator
{
public int Subtract(int a, int b)
{
return a - b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
标准合并工具可能需要您手动合并这两个文件,但是理解代码功能的文件很容易就能够协调这两个更改.这同样适用于删除或添加其他方法,注释,区域或使用语句.
所以,(终于!)得到的问题是:是否有任何合并工具能够智能地理解代码的功能,并且可以在不进行任何人为干预的情况下合并上述两个文件?如果没有,为什么不呢?是否有任何并发症使这成为一个无法解决的问题(当然,理解它并不像我所说的那么简单 - 但是由于某种原因我无法看到它?)
我在我的源代码中使用了C#,并且会喜欢与之相关的东西,但我很感兴趣,如果它存在于编程世界的任何地方......
我已经非常关注这个问题的长度,但编辑后添加了我期望智能源系统的工作方式:
在系统中检查初始计算器文件时,将解析文件并创建类的层次结构:
File: Calculator.cs
|
|--Class[0]: Calculator
|
|--Method[0]: Subtract
|
|--Line[0]: return a + b;
|
|--Method[1]: Add
|
|--Line[0]: return a +b;
Run Code Online (Sandbox Code Playgroud)
(在那里有额外的线条用于支架......)
当我签入我的代码(使方法按字母顺序排列)时,它会更新上面的层次结构,以便Subtract成为Method [1]而Add成为Method [0].
第二个开发人员检查他的代码(显然源控制系统知道是基于原始代码)并注意到减去第一行的更改.现在,不是在整个文件中逐行找到它,而是知道它可以找到一个Calculator.cs/Calculator/Subtract/0并且该方法改变位置的事实并不重要,它仍然可以使合并工作.
我认为数据库中的源代码是您问题的一个潜在答案。一般的想法是,您不对文件进行版本控制,而是对代码块进行版本控制。版本控制系统了解代码 DOM,并允许您查询代码 DOM,以便检查函数、类、您拥有的内容、进行编辑、编译等。
由于方法的顺序不一定重要,因此它们不会以任何顺序存储在数据库中。当您查看课程时,您可以指定您最喜欢的顺序(按字母顺序、公共/受保护/私有等)。唯一重要的更改是诸如将 切换+
到-
. 您不会因重新排序方法而产生冲突。
不幸的是,SCID 还很年轻,并且没有太多可用的工具。然而,对于查看和编辑代码的方式来说,这是一个非常有趣的演变。
编辑: 这是 SCID 的另一个参考