diff
命令及其各种版本在计算两个文本文件之间的差异并以比完整显示两个文件更为简洁的方式表达此差异方面是相当不错的。它将差异显示为一系列插入和删除的行块(或在某些情况下,更改的行块,但这相当于先删除后插入)。同样或非常类似的程序或算法被patch
和源代码控制系统用于最小化表示同一文件的两个版本之间的差异所需的存储空间。该算法在此处和此处都有讨论。
但是,当文本块在文件内部移动时,它就会失效。
假设您有以下两个文件:a.txt
和b.txt
(想象它们都比只有6行的例子要长得多):
a.txt b.txt
----- -----
1 4
2 5
3 6
4 1
5 2
6 3
diff a.txt b.txt
显示如下:
$ diff a.txt b.txt
1,3d0
< 1
< 2
< 3
6a4,6
> 1
> 2
> 3
从 a.txt
到 b.txt
的变更可以表示为“取前三行并将其移动到末尾”,但是 diff
显示了移动的文本块的完整内容两次,错过了一个非常简短地描述这个大变化的机会。请注意,diff -e
只显示一次文本块,但这是因为它不显示已删除行的内容。是否有 diff
算法的变体,既保留了 diff
表示插入和删除的能力,又能有效地表示移动文本块而无需显示其全部内容?
git diff --anchored=<text>
也应该被考虑。请参见我的下面的答案。 - VonC