1.用diff命令比较两个文本文件或目录的差异
hello文件
应该杜绝文章中的错别字。
但是无论使用
* 全拼,双拼
* 还是五笔
是人就有可能犯错,软件更是如此。
犯了错,就要扣工资!
改正的成本可能会很高。
world文件
应该杜绝文章中的错别字。
但是无论使用
* 全拼,双拼
* 还是五笔
是人就有可能犯错,软件更是如此。
改正的成本可能会很高。
但是“只要眼球足够多,所有Bug都好捉”,这就是开源的哲学之一。
diff命令
$ diff -u hello world > diff.txt
diff.txt
1 --- hello 2011-09-17 22:01:48.584918152 +0800
2 +++ world 2011-09-17 22:03:02.220931230 +0800
3 @@ -1,4 +1,4 @@
4 -应该杜绝文章中的错别字。
5 +应该杜绝文章中的错别字。
6
7 但是无论使用
8 * 全拼,双拼
9 @@ -6,6 +6,6 @@
10
11 是人就有可能犯错,软件更是如此。
12
13 -犯了错,就要扣工资!
14 +改正的成本可能会很高。
15
16 -改正的成本可能会很高。
17 +但是“只要眼球足够多,所有Bug都好捉”,这就是开源的哲学之一。
第1行和第2行分别记录了原始文件和目标文件的文件名及时间戳。以三个减号(---)开始的行标识的是原始文件,以三个加号(+++)开始的行标识的是目标文件。
在比较内容中,以减号(-)开始的行是只出现在原始文件中的行。
在比较内容中,以加号(+)开始的行是只出现在目标文件中的行。
在比较内容中,以空格开始的行,是在原始文件和目标文件中都出现的行,这些行是用作差异比较的上下文。
第3-8行是第一个差异小节。每个差异小节以一行差异定位语句开始。第3行就是一条差异定位语句,其前后分别用两个@ 进行标识。
第3行定位语句中 -1,4 的含义是:本差异小节的内容相当于原始文件的从第1行开始的4行。而第4、6、7、8行是原始文件中的内容,加起来刚好是4行。
第3行定位语句中 +1,4 的含义是:本差异小节的内容相当于目标文件的从第1行开始的4行。而第5、6、7、8行是目标文件中的内容,加起来刚好是4行。
因为命令diff是用于行比较的,所以即使改正了一个字,也显示为一整行的修改。
第9-17行是第二个差异小节。第9行是一条差异定位语句。
2.命令patch相当于diff的反向操作
有了 hello 和 diff.txt 文件,可以放心地将 world 文件删除或用 hello 文件将 world 文件覆盖。用下面的命令可以还原 world 文件:
$ cp hello world
$ patch world < diff.txt
也可以保留 world 和 diff.txt 文件,删除 hello 文件或用 word 文件将hello 文件覆盖。用下面的命令可以恢复 hello 文件:
$ cp world hello
$ patch -R hello < diff.txt
命令 diff 和 patch 还可以对目录进行比较操作,这也就是 Linus 在 1991~2002 年用于维护 Linux 不同版本间差异的办法。在没有版本控制系统的情况下,可以用此命令记录并保存改动前后的差异,还可以将差异文件注入版本控制系统(如果有的话)。
标准的 diff 和 patch 命令存在一个局限,就是不能对二进制文件进行处理。对二进制文件的修改或添加会在差异文件中缺失,进而丢失对二进制文件的改动或添加。Git 对差异文件格式提供了扩展支持,支持二进制文件的比较,解决了这个问题。