代码之家  ›  专栏  ›  技术社区  ›  Martin Harris

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

  •  11
  • Martin Harris  · 技术社区  · 16 年前

    我最近一直在研究一个大型代码库,重构和总体上改进设计以增加覆盖率。另外,在相当多的文件中,我使用语句删除了多余的部分,移动了方法,以便相似的功能紧密结合在一起,添加了区域等,但实际上并没有改变文件中代码的功能。

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

    现在,我理解了一个一般规则,在一个源代码控制的环境中,四处移动方法可能是一件危险的事情,并且我们决定利益大于成本。但我不明白的是为什么会这样。

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

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

    另一个开发人员修复了Subtract方法中的错误

    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成为方法[1],Add成为方法[0]。

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   dustyburwell    16 年前

    我认为 Source Code in Database 是你问题的一个潜在答案。一般的想法是,你不版本文件,你版本代码块。版本控制系统了解代码dom,并允许您查询代码dom,以便签出函数、类、您拥有的内容,以进行编辑、编译等。

    因为方法的顺序不一定重要,所以它们不以任何顺序存储在数据库中。当您签出类时,可以指定您最喜欢的顺序(按字母顺序、public/protected/private等)。唯一重要的变化是你在哪里切换 + 到A - . 重新排序方法不会产生冲突。

    不幸的是,科学与发展署还很年轻,而且没有很多工具来支持它。然而,在查看和编辑代码的方式上,这是一个非常有趣的进化。

    编辑: Here's another reference for SCID

        2
  •  4
  •   pablo    16 年前

    我们使用塑料单片机的方法还远远没有“完成”,但它已经发布,可以在这种情况下提供帮助。看一看 Xmerge . 当然,反馈不仅仅是受欢迎的,还将授予一些免费许可证;-)