我最近一直在研究大型代码库、重构和总体改进设计以增加覆盖范围。此外,在相当多的文件中,我删除了多余的 using 语句,移动了方法以使类似的功能靠近在一起,添加了区域等。但实际上并没有改变文件中代码的功能。

与此同时,团队其他地方的其他开发人员正在修复错误并到处更改代码行。显然,当涉及到合并时,这可能是一个问题,因为行号不再匹配并且方法可能已移动。

现在,我了解了一般规则,即在源代码受控环境中,移动方法可能是一件危险的事情,我们认为收益大于成本。然而我不明白的是为什么它应该是这样的。

假设我的初始文件是一个简单的计算器:

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;
    }
}

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

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

我在我的源代码中使用 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 ,而不是在整个文件中逐行查找该行号,并且该方法已更改位置这一事实并不重要,它仍然可以使合并工作。

有帮助吗?

解决方案

我觉得 数据库中的源代码 是你问题的一个潜在答案。一般的想法是,您不对文件进行版本控制,而是对代码块进行版本控制。版本控制系统了解代码 DOM,并允许您查询代码 DOM,以便检查函数、类、您拥有的内容、进行编辑、编译等。

由于方法的顺序不一定重要,因此它们不会以任何顺序存储在数据库中。当您查看课程时,您可以指定您最喜欢的顺序(按字母顺序、公共/受保护/私有等)。唯一重要的更改是诸如切换位置之类的更改 + 到一个 -. 。您不会因重新排序方法而产生冲突。

不幸的是,SCID 还很年轻,并且没有太多可用的工具。然而,对于查看和编辑代码的方式来说,这是一个非常有趣的演变。

编辑: 这是 SCID 的另一个参考

其他提示

我们的塑料 SCM 方法还远未“完成”,但它已经发布,可以在这种情况下提供帮助。看一眼 X合并. 。当然,我们非常欢迎反馈,并将授予一些免费许可证;-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top