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

Bry*_*yon 10 c++ git diff

所以,我已经遇到过几次这个问题了.在一轮更改中,我删除functionA()并添加functionB()到同一个地方.当我运行时diff,我最终会遇到一系列可怕的混乱变化,它会尝试将两个函数匹配在它们的常用括号上,而不是将所有这些functionA作为删除而全部functionB作为补充.有关简化示例:

int functionA(int a, bool b)
{
    int c;
    bool d;
    if (a == b)
    {
        //do stuff
    }
    //do more stuff
}
Run Code Online (Sandbox Code Playgroud)

换成了

void functionB()
{
    // do different stuff
    for (int x=0; x<10; x++)
    {
        //do more different stuff
    }
    //do even more different stuff
}
Run Code Online (Sandbox Code Playgroud)

差异可能会产生

-int functionA(int a, bool b)
+void functionB()
 {
-    int c;
-    bool d;
-    if (a == b)
+    // do different stuff
+    for (int x=0; x<10; x++)
     {
-        //do stuff
+        //do more different stuff
     }
-    //do more stuff
+    //do even more different stuff
 }
Run Code Online (Sandbox Code Playgroud)

这是无用的,也很难阅读,因为除了大括号之外,真的没有共性.它甚至会跳过不对齐的大括号,直到它找到那些做的,这是很常见的.在我正在看的一个案例中,我删除了7个连续的函数并添加了3个,这些函数大致相同,更容易阅读/维护.diff算法以分散的方式在所有7个删除的函数中分配添加内容,从而产生难以理解和混乱的混乱.

有没有办法调整git diff来忽略只有通用性是大括号的情况?

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

在寻找现有问题时,我能找到的最近的问题是什么git diff --patience 但是,这对我的差异影响很小.(它不同,但不明显更清晰)

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

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

tor*_*rek 1

Git 目前1提供四种 diff 算法,称为myers(默认)、minimalpatiencehistogram。最后一个是对patience. 不过,这些都在 Git 版本 1.9.0 中。如果它们都不能满足您的要求,您可以告诉 Git 使用外部差异。有关详细信息,请参阅文档的“生成差异文本”部分gitattributes(参考主要 git 文档)。这有点复杂,但总而言之,您可以gitattributes强制 Git 运行外部 diff 程序,并通过编写脚本(通常是 sh/bash)并在全局或每个存储库设置中配置它来定义外部 diff 程序


1无论如何,从 2.8.x 版本开始;2.9已经快出来了,没有任何新的。

  • 有趣。但并没有真正回答这个问题。您知道有任何外部差异程序可以执行所要求的操作吗?还是你自己写的情况? (2认同)