gpt4 book ai didi

c++ - 完全替换功能时是否有可能获得清晰的 git diff?

转载 作者:可可西里 更新时间:2023-11-01 16:47:25 25 4
gpt4 key购买 nike

所以,这个问题我遇到过几次。在一轮更改中,我删除了 functionA() 并在同一位置添加了 functionB()。当我运行 diff 时,我最终得到了一组可怕的困惑更改,它尝试在它们的公共(public)括号上匹配两个函数,而不是将所有 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 选项,它可以满足我的要求,但仅限于文件级别,而不是函数级别。

如果没有别的,我想我可以尝试在未来养成一个习惯,在我希望差异在一个 block 中显示添加的情况下,将新逻辑放在文件的任何删除部分完全不同的部分,但我更愿意将相关逻辑放在一起。

最佳答案

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


1从 2.8.x 版开始; 2.9 快出来了,没有任何新的。

关于c++ - 完全替换功能时是否有可能获得清晰的 git diff?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37685266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com