假设我有两个文件。第一个的内容是:
line 1
foo
line 2
line 1
bar
line 2
第二个在中间插入了一个新部分,所以它看起来像这样:
line 1
foo
line 2
line 1
new text
line 2
line 1
bar
line 2
现在,当我执行“diff -u”时,我得到如下输出:
--- file1 2013-06-25 16:27:43.170231844 -0500
+++ file2 2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2
line 1
+new text
+line 2
+
+line 1
bar
line 2
这并不能正确反映插入的中间节 - 相反,它使它看起来像第二节已更改,并且新的节添加到末尾(这是因为算法从第一个不同的行开始)。
有没有办法让 diff (单独或使用 git diff)来显示此输出?
--- file1 2013-06-25 16:27:43.170231844 -0500
+++ file2 2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2
+
+line 1
+new text
+line 2
line 1
bar
line 2
这主要是在生成补丁供某人审阅时出现的问题,其中一个新函数被插入到一组相似的函数中。默认行为并不反映真正发生的变化。
答案1
Git 2.9 于今年早些时候发布,其中包括命令--compaction-heuristic
上的实验标志git diff
:
在 2.9 中,Git 的 diff 引擎学习了一种新的启发式:它尝试将块边界保持在空行,只要块的底部与前面上下文的底部匹配,就将块“向上”移动,直到我们遇到空行。
我认为 GitHub 没有在 Web UI 上启用差异以进行 Pull 请求和比较,但您可以在本地进行。--word-diff
如果您需要这种粒度级别,我建议结合使用它。
更多详细信息,请访问 GitHub 博客:https://github.com/blog/2188-git-2-9-has-been-released
答案2
耐心差异算法 ( git diff --patience
) 可能会给您更自然的结果,但并非在所有情况下都是如此。
答案3
在某些情况下,命令git diff --word-diff
(或--color-words)可能会给您更好的结果