如果我有这个文件
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
(它提供的每个差异算法,耐心,最小,直方图和迈尔斯)。有没有办法说服它产生语义更清晰的差异?
答案 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?