Shell 查找并修补文件差异,当文件存在多个版本时,如果能够重点标记出这些版本之间的不同而无须通过人工查看来比较,那就简直是太棒了。本章为你演示如何生成文件之间的差异对比。当多名开发人员共事时,某个人对于文件的修改必须告知其他人。要是发送整个源代码的话,可是一件耗时的活儿。这时,发送一个差异文件就显得很有用了,因为该文件中只包含那些被修改、添加或删除的行以及行号。这种差异文件叫作修补文件(patch file)。我们可以用patch
命令将修补文件中包含的变更信息应用到原始文件,也可以再次进行修补来撤销变更。
实战演练
diff
命令可以生成两个文件之间的差异对比。
(1) 先创建下列用于演示的文件。
文件 1:version1.txt
this is the original text
line2
line3
line4
happy hacking !
文件 2:version2.txt
this is the original text
line2
line4
happy hacking !
GNU is not UNIX
(2) 非一体化(nonunified)形式的diff
输出(不使用-u
选项)如下:
$ diff version1.txt version2.txt
3d2
<line3
6c5
> GNU is not UNIX
(3) 一体化形式的diff
输出如下:
$ diff -u version1.txt version2.txt
--- version1.txt 2010-06-27 10:26:54.384884455 +0530
+++ version2.txt 2010-06-27 10:27:28.782140889 +0530
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
-
+GNU is not UNIX
选项-u
用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件之间的差异,所以人们往往更喜欢这种输出形式。
在一体化diff
输出中,以+
起始的是新加入的行,以-
起始的是被删除的行。
(4) 修补文件可以通过将diff
的输出重定向到一个文件来生成:
$ diff -u version1.txt version2.txt > version.patch
现在就可以用patch
命令将变更应用于其中任意一个文件。当应用于version1.txt时,就可以得到version2.txt;而当应用于version2.txt时,就得到了version1.txt。
(5) 用下列命令来进行修补:
$ patch -p1 version1.txt < version.patch
patching file version1.txt
version1.txt的内容现在和version 2.txt一模一样了。
(6) 下列命令可以撤销作出的变更:
$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y
# 变更被撤销
如上例所示,对已修补过的文件再修补将撤销作出的变更。如果使用patch
命令的-R
选项,则不会提示用户y/n
。
补充内容
让我们再看一些diff
的其他特性。
生成目录的差异信息
diff
命令也能够以递归的形式处理目录。它会对目录中的所有内容生成差异对比。使用下面的命令:
$ diff -Naur directory1 directory2
该命令中出现的选项含义如下。
-N
:将缺失的文件视为空文件。-a
:将所有文件视为文本文件。-u
:生成一体化输出。-r
:递归遍历目录下的所有文件。