【问题标题】:How can I make git diff make clearer patches如何让 git diff 制作更清晰的补丁
【发布时间】:2017-11-06 16:34:33
【问题描述】:

如果我有这个文件

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

(使用它提供的每个 diff 算法、耐心、最小、直方图和myers)。有没有办法说服它生成语义上更清晰的差异?

【问题讨论】:

  • afaik 不在命令行中,但您可以在浏览器中切换差异拆分/差异统一:github.com/blog/1884-introducing-split-diffs 这也可能是有用的信息:stackoverflow.com/questions/27350678/…
  • 尝试添加--diff-algorithm=patience。我不知道它在这种情况下是否会起作用,但这是它想要改进的某种东西。
  • @Mort 遗憾的是,在这种情况下它不是,但感谢您的建议。

标签: git diff git-diff


【解决方案1】:

您需要的是一个能够理解所涉及语言语义的差异引擎。这些是罕见的。虽然它已被关闭为题外话,请参阅syntax aware diff tools?Typical diffs split at line or word boundary,然后找到最小编辑距离,这是将改变A版改成B版。它不必在语义上有意义,它只需要简短。 Git 的内置算法搜索“short”(并不总是 shortest,因为默认的 myers 算法使用启发式算法更快地产生结果)但不是“语义上合理的”。内置的替代算法是:

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

显然,您已经尝试过这些,但没有一个比语法感知差异更好。

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

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多