该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
to的变化b.txt
可以表示为“将前三行移到最后”,但是diff
两次显示了移动的行块的完整内容,错过了非常简要地描述这个大变化的机会。
请注意,diff -e
该文本块仅显示一次,但那是因为它不显示已删除行的内容。
算法的变体是否diff
(a)保留diff
了表示插入和删除的能力,以及(b)有效地表示移动的文本块而不必显示其全部内容?