diff - 逐行比较文件。
格式: diff 参数 旧文件/旧文件夹 新文件/新文件夹 (注意顺序 新旧文件夹的顺序)
diff有很多参数,但是在制作补丁中主要使用以下参数。
-N 将不存在的文件看作是空的 -a 将所有文件都视为文本文件 -u 以合并的方式来显示文件内容的不同 -r 以递归地方式比较所有子目录
// 比较Test2在Test1版本上的更新并输出
diff -Naru Test1 Test2
// 比较Test2在Test1版本上的更新并输出到文件diff.patch
diff -Naru Test1 Test2 > diff.patch
$ cat a.c
12345
67890
abcdefg
hijklmn
opq
rst
$ cat b.c
12345
67908
abcdefg
ABCDEFG
hijklmn
oq
运行看看,只要将其重定向文件就相当于制作成文件:
$ diff a.c b.c -Naur --- a.c 2019-12-26 22:47:23.826403400 +0800 +++ b.c 2019-12-26 22:47:21.287250500 +0800 @@ -1,6 +1,6 @@ 12345 -67890 // -代表删除此行 +67908 // +增加此行; 先-后+ 相当于等于将67890改为67908 abcdefg +ABCDEFG // +增加此行 hijklmn -opq // -代表删除此行 -rst // -代表删除此行 +oq // +增加此行
只要将其重定向文件就相当于制作成补丁:
diff -Naru a.c b.c > diff.patch
打补丁:
patch - 将一个diff文件应用到一个原始文件
格式:
patch 参数 < 补丁 -b 备份原始文件,打补丁时,会复制或者重命名原始文件来备份 -R 撤销补丁 -p(num) 表示忽略num层路径
对于文件打补丁
直接使用以下命令即可:
patch -b < diff.patch
效果:让a.c 的内容变成与 b.c 一模一样,保留一份后缀为.orig但内容与a.c之前的内容一样的文件。
对于目录的补丁
使用 -pN (N代表数字)指定目录的补丁从第几级路径开始。
kernel_a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c kernel_b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c 假设补丁头是上面一行 如果使用 -p0,就从 / 目录开始,也就是从 kernel_a 目录开始; 如果使用 -p1,就从 drivers 目录开始,也就是从 kernel/drivers 目录开始,忽略 kernel 当前目录下的差异文件; 以此类推。
来到两个差异目录的根目录,输入下面命令,让补丁从根目录开始改动差异
patch -bp0 < diff.patch
可以使用 -x 排除指定的路径
撤销补丁:
patch - 将一个diff文件应用到一个原始文件
格式
patch -R [其他参数] < 补丁
-R 撤销已打的补丁