diff 以行为单位比较两个文本文件(或者是目录),并将不同之处输出到标准输出上,
patch可以读入这些输出,并按照一定的指令使源文件(目录)更新
diffutils-2.7.2-2
patch-2.5.4-10
1, diff
options:
-r --recursive
-p --show-c-function //标识不同之处所在的函数名(只用于C程序)
-e --ed //ed 命令格式 diff -e test1 test2
//混合ed命令格式(无参数) diff test1 test2
-f //RCS命令简单格式 diff -f test1 test2 Revision Control System
-c --context //旧版上下文格式 diff -c test1 test2
-u --unified //新版上下文格式 diff -u test1 test2
-N //如果某个文件只在一个目录中出现,则假定在另一个目录中为空文件.
diff的输出格式有三种:列举方式,命令模式,上下文模式
命令模式有:ed命令模式和RCS(Revision Control System)
上下文模式有:旧版和新版
命令模式记录的是从test1更新到test2所需要执行的命令,而上下文模式可读性更好一些.
Linux内核源代码就是按照新版上下文模式用diff组织的,
eg. diff -Nur linux-2.4.15 linux
2. patch
patch [options] [originalfile] [patchfile]
如果patchfile为空,则从标准输入读取
一般使用下面的形式:
patch -p[num] < patchfile
如果不提供p参数将忽略所有的目录信息,
-p0表示使用全部的路径信息
-p1表示忽略第一"/"以前的目录,依次类推
patch可以直接操作上下文格式以及混合ed格式的diff输出文件,而将ed格式文件通过管道提交给ed程序,
不清楚如何处理RCS格式文件.
eg.
bzcat linux-2.6.1.patch.bz2 | patch -p0
如果希望恢复到原来的版本可以使用 -R (--reverse)参数
但是只对上下文格式的diff文件有效.
eg. patch -R < program-1.2.patch
3. diff-patch和CVS的配合使用
在这种情况下,注意不要把CVS目录包括进去
eg.
patch -Nur program-1.0 program-1.1 --exclude=CVS