【发布时间】:2016-06-07 17:05:27
【问题描述】:
所以,我遇到过几次这个问题。在一轮更改中,我删除了functionA() 并在同一位置添加了functionB()。当我运行diff 时,我最终得到了一组可怕的混乱更改,它尝试在它们的公共大括号上匹配这两个函数,而不是将所有functionA 显示为删除,将所有functionB 显示为添加.举个简单的例子:
int functionA(int a, bool b)
{
int c;
bool d;
if (a == b)
{
//do stuff
}
//do more stuff
}
替换为
void functionB()
{
// do different stuff
for (int x=0; x<10; x++)
{
//do more different stuff
}
//do even more different stuff
}
差异可能会产生
-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
}
这是无用且难以阅读的,因为除了大括号之外真的没有共同点。它甚至会跳过不对齐的大括号,直到找到对齐的大括号,这很常见。在我现在看到的一种情况下,我删除了 7 个连续的函数并添加了 3 个,它们以更容易阅读/可维护的方式做大致相同的事情。 diff 算法通过所有 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 在一个块中显示添加的情况下,将新逻辑放在文件的完全不同的部分中,而不是任何删除,但我'希望将相关的逻辑放在一起。
【问题讨论】:
-
我使用 git 2.8.0 的 4 个
git diff算法中的任何一个都得到了相同的结果。它看到{和}行没有改变。