如何让git diff制作更清晰的补丁

时间:2017-11-06 16:34:33

标签: git diff git-diff

如果我有这个文件

def main():
    foo
    bar
    baz
    quux
    corge

我将其更改为

def other():
    foo
    bar
    baz

def main():
    other()
    quux
    corge

我真的很想看到差异

+def other():
+    foo
+    bar
+    baz
+
 def main():
+    other()
-    foo
-    bar
-    baz
     quux
     corge

git diff给了我

-def main():
+def other():
     foo
     bar
     baz
+
+def main():
+    other()
     quux
     corge

它提供的每个差异算法,耐心,最小,直方图和迈尔斯)。有没有办法说服它产生语义更清晰的差异?

1 个答案:

答案 0 :(得分:1)

您需要的是一种了解所涉及语言语义的差异引擎。这些很少见。虽然它已作为偏离主题关闭,但请参阅syntax aware diff tools?典型差异在行或单词边界处分割,然后找到最小编辑距离,这是最短的操作集将A版本更改为B版。它不需要在语义上有任何意义,它只需要很短。 Git的内置算法搜索“short”(并不总是短 est ,因为默认的myers算法使用启发式来更快地产生结果)但不是“语义敏感”。内置的替代算法是:

  • minimal:与myers相同,但避免了生成真正最小编辑距离的快捷方式。
  • patience:在为myers-style diff构建框时,仅匹配唯一行。对于使用重复括号或then / else / endif行生成无意义匹配的编程语言,可以提供更好的结果。
  • histogram:不是丢弃每个框中的重复行,而是根据行出现的频率将加权添加到匹配项中。更频繁的线路获得更低的权重。理论上,这应该产生最好的结果(考虑到非“语法感知”差异的基本问题)。

显然,你已经尝试了这些,没有一个像语法识别差异一样好。

假设您已经获得或编写了更好的差异,那么您可以将其作为外部差异实用程序插入Git。请参阅How do I view 'git diff' output with a visual diff program?Why doesn't `git diff` invoke external diff tool?