【问题标题】:Is it possible to get a clear git diff when replacing a function entirely?完全替换函数时是否可以获得清晰的 git diff ?
【发布时间】: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 在一个块中显示添加的情况下,将新逻辑放在文件的完全不同的部分中,而不是任何删除,但我'希望将相关的逻辑放在一起。

【问题讨论】:

标签: c++ git diff


【解决方案1】:

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


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

【讨论】:

  • interesting.but 并没有真正回答这个问题.. 你知道有什么外部差异程序可以做被问到的事情吗?还是自己写?
  • @ShoeLace:据我所知没有,意思是“是的,写你自己的”。 Ira Baxter's syntax-aware one 也可以解决问题。您可以将其作为外部差异挂钩到 Git 中。 (我没有那个程序,无法提供进一步的建议。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2011-03-30
  • 1970-01-01
  • 2012-11-17
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多