完全替换函数时是否可以获得清晰的git diff?

时间:2016-06-07 17:05:28

标签: c++ git diff

所以,我已经遇到过这个问题几次了。在一轮更改过程中,我删除NSShadow并在同一位置添加functionA()。当我运行functionB()时,我最终会遇到一系列可怕的混乱变化,它会尝试将两个函数匹配在它们的共同括号上,而不是将所有diff显示为删除和所有{{{ 1}}作为补充。举一个简单的例子:

functionA

替换为

functionB

差异可能会产生

int functionA(int a, bool b)
{
    int c;
    bool d;
    if (a == b)
    {
        //do stuff
    }
    //do more stuff
}

这是无用且难以阅读的,因为除了括号之外,它们之间并不存在共性。它甚至会跳过不对齐的大括号,直到它找到那些已经完成的大括号。在我现在看的一个案例中,我删除了7个连续的函数并添加了3个,这些函数大致相同,更易于阅读/维护。差异算法通过所有7个被删除的函数以分散的方式分配添加内容,从而产生难以理解和混乱的混乱。

有没有办法调整git diff以忽略唯一的共性是括号的情况?

如果重要,我的系统目前有git 1.9.0和diff(GNU difftools)2.8.1 我标记了C ++,因为我所使用的系统(主要是C风格)C ++,但这应该适用于许多其他语言。

在寻找现有问题时,我找到的最近的问题是What is git diff --patience for? 但是,这对我的差异影响很小。 (这是不同的,但不是明显更清晰)

我还在git diff手册页中看到了--break-rewrites选项,它可以实现我想要的功能,但仅限于文件级别,而不是功能级别。

如果没有别的,我想我可以尝试养成一个习惯,将新逻辑放在文件的一个完全不同的部分中,除非我想让diff在一个块中显示添加,但我和#39; d喜欢将相关逻辑保持在一起。

1 个答案:

答案 0 :(得分:1)

Git目前 1 提供四种差异算法,称为myers(默认值),minimalpatiencehistogram。最后一个是对patience的轻微调整。不过,这些都是在Git 1.9.0版本中。如果它们都没有你想要的,你可以告诉Git使用外部差异。有关详细信息,请参阅the "Generating diff text" section of the gitattributes documentation(返回主git文档)。这有点复杂,但总而言之,你使用gitattributes强制Git运行外部差异程序,你通过编写脚本(通常是sh / bash)定义外部差异程序并在全局或每个存储库设置中进行配置。

1 从版本2.8.x开始; 2.9差不多了,没有任何新的。