1.diff是对两个集合的差运算,diff比较两个文件之间或两个文件集合(目录)文件的差异,并记录下来,生成一个diff文件,这个文件就是我们说的patch文件:
diff oldfile,newfile > out.patch
2.那么通过oldfile,patch得到newfile就是打补丁的过程:
patch oldfile out.patch
3.如果想通过newfile,patch得到oldfile:
patch -R newfile out.patch
4.diff -rc oldfile newfile
-r:当oldfile与newfile为目录时递归调用
-c:out.patch会生成一些额外的信息
5.patch文件格式
(1)补丁头:分别由---或+++开头的两行。
---标识oldfile相对文件路径,+++标识newfile相对文件路径
(2)块:以@@ - num1,num2 + num3,num4 @@开始,以下一个块的开始或者一个新的补丁头的上一行为结束。
- 标识oldfile,num1标识补丁块在oldfile中的起始位置,num2标识补丁块在oldfile中的最大偏移
+标识newfile,num1标识补丁块在newfile中的起始位置,num2标识补丁块在newfile中的最大偏移
块中每一行开头为“-”表示在newfile中将删除这一行,开头为“+”表示在newfile中将添加这一行,没有"-"或"+"的在newfile中保持不变
6.patch使用
因为在patch文件的补丁头“---”一行标识了oldfile的文件路径,所以在打补丁时不需要写出oldfile:
patch <out.patch>
如果补丁为diff -rc ./DIR_A/A ./DIR_B/B > out.patch
在out.patch中为: ---DIR_A/A
而当前目录为./DIR_A/,那么如果打补丁时输入
patch <out.patch
则程序会在./DIR_A/DIR_A/中去寻找文件A,就错了
这时,使用命令patch -p数字 <out.patch将忽略---第数字个"/"前的路径,所以在上述情况下输入
patch -p1 <out.patch则正确