所以,我已经遇到过几次这个问题了.在一轮更改中,我删除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在一个块中显示添加,但我更喜欢将相关逻辑保持在一起.
Git 目前1提供四种 diff 算法,称为myers(默认)、minimal、patience和histogram。最后一个是对patience. 不过,这些都在 Git 版本 1.9.0 中。如果它们都不能满足您的要求,您可以告诉 Git 使用外部差异。有关详细信息,请参阅文档的“生成差异文本”部分gitattributes(参考主要 git 文档)。这有点复杂,但总而言之,您可以gitattributes强制 Git 运行外部 diff 程序,并通过编写脚本(通常是 sh/bash)并在全局或每个存储库设置中配置它来定义外部 diff 程序。
1无论如何,从 2.8.x 版本开始;2.9已经快出来了,没有任何新的。