是否有任何用于理解代码的源代码管理合并工具?

时间:2009-04-29 14:03:04

标签: 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;
    }
}

我决定我希望这些方法按字母顺序排列:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a + b;
    }        
}

另一位开发人员修复了减法方法中的错误

public class Calculator
{
    public int Subtract(int a, int b)
    {
        return a - b;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

标准合并工具可能需要您手动合并这两个文件,但是理解代码的功能的文件很容易就能够协调这两个更改。这同样适用于删除或添加其他方法,注释,区域或使用语句。

所以,(最后!)得到的问题是:是否有任何合并工具能够智能地理解代码的功能,并且可以在不进行任何人为干预的情况下合并上述两个文件?如果没有,为什么不呢?是否有任何并发​​症使这成为一个无法解决的问题(当然,理解它并不像我所说的那么简单 - 但是由于某种原因我无法看到它?)

我在我的源代码中使用了C#,并且会喜欢与之相关的东西,但是如果这在编程世界的任何地方都存在,我感兴趣...


我已经非常关注这个问题的长度,但编辑后添加我希望智能源系统的工作方式:

在系统中检查初始计算器文件时,将解析文件并创建该类的层次结构:

File: Calculator.cs
|
|--Class[0]: Calculator
    |
    |--Method[0]: Subtract
         |
         |--Line[0]: return a + b;
    |
    |--Method[1]: Add
         |
         |--Line[0]: return a +b;

(括号中有额外的线条等......)

当我签入我的代码(使方法按字母顺序排列)时,它会更新上面的层次结构,以便Subtract成为Method [1],Add成为Method [0]。

第二个开发人员检查他的代码(显然源控制系统知道是基于原始代码)并注意到减去第一行的更改。现在,不是在整个文件中逐行找到它,而是知道它可以找到一个Calculator.cs / Calculator / Subtract / 0并且该方法改变位置的事实并不重要,它仍然可以使合并工作。

2 个答案:

答案 0 :(得分:4)

我们使用Plastic SCM的方法还远未完成,但它已经发布并可以在这种情况下提供帮助。看看Xmerge。当然,反馈将非常受欢迎,并将授予一些免费许可; - )

答案 1 :(得分:3)

我认为Source Code in Database是您问题的一个潜在答案。一般的想法是你没有版本文件,你的版本代码块。版本控制系统知道代码DOM,并允许您查询代码DOM,以便检查函数,类,有什么用途,编辑,编译等。

由于方法的顺序不一定重要,因此它们不会以任何顺序存储在数据库中。签出课程时,您可以指定您最喜欢的顺序(按字母顺序排列,公共/受​​保护/私人等)。唯一重要的更改是您将+切换为-的位置。由于重新排序方法,您不会有冲突。

不幸的是,SCID仍然很年轻,并没有很多工具可供选择。但是,在查看和编辑代码的方式中,这是一个非常有趣的演变。

修改: Here's another reference for SCID