diff 和 patch 命令——差异比较和打补丁
差异比较
diff [-p] [-u] <文件路径> <文件路径> ——比较文件差异
-u 参数很重要,它使得差异输出中带有上下文,而不仅仅是差异;对于C文件,使用 -p 参数可显示差异所在的函数的名称。
使用 -u 参数时,差异输出格式如下,
- (−−−)开头的行标识的是
原始文件
- (+++)开头的行标识的是
目标文件
- (−)开头的行是
只出现在原始文件
中的行 - (+)开头的行是
只出现在目标文件
中的行 - @@ -1,8 +1,8 @@ 表示是原始文件从第一行开始的八行跟目标文件从第一行开始的八行在进行比较
diff [-r] [-u] <目录路径> <目录路径> ——比较目录差异
默认不在子目录下进行比较,使用 -r 参数可对子目录进行递归比较,不同路径下的同名文件不会进行比较。
diff [-u] <文件路径> <文件路径> > <输出路径>——输出差异文件
将差异输出到文件中,然后可以放心删除原始文件和目标文件中的一个,输出的差异文件可用于恢复目标文件或原始文件。
打补丁
patch <原始文件> < <差异文件>——差异文件注入(打补丁)
将差异注入原始文件,得到目标文件。
patch -R <原始文件> < <差异文件>——撤销补丁
使用 -R (Reverse)参数撤销差异注入,从目标文件得到原始文件。
patch -p0 < <差异文件>——从当前目录开始打补丁
要在使用 diff 命令输出差异文件的目录开始打补丁,使用 -p0 参数,-p 参数表示剥离路径,0 表示剥离0级,假如文件路径是 dir/text/readme.txt,剥离 1 级后是 text/readme.txt,剥离 2 级后是 readme.txt。
patch -p1 < ../<差异文件>——从子目录开始打补丁
忽略第1层目录打补丁,此时需要进入到子目录路径下,从子目录开始打补丁。如果使用 -p2 参数,则需要进入到第二层子目录,从第二层子目录开始打补丁。
注意:diff 使用 -r (recursive),而 patch 使用 -R (reverse)