diff和patch命令

Table of Contents

在开发中diff和patch是非常常用的两个命令。

介绍两个命令之前,先准备两个示例代码。

/* filename: old.c */

#include <stdio.h>

int main(void) {
  printf("old");
  return 0;
}
/* filename: new.c */

#include <stdio.h>


int main(void) {
  printf("new");
  return 0;
}

1 diff

用于比较两个新旧文件之间的变化差异,用法:

diff 旧文件 新文件

注意新旧文件作为参数的顺序,顺序错误,生成的补丁也会引起不正确的改动。

比较两个文件的差异:

$ diff old.c new.c
4c4
<   printf("old");
---
>   printf("new");

把diff的结果作为补丁是非常常用的,只需用-u参数:

$ diff -u old.c new.c
--- old.c 2016-08-19 22:06:07.088790973 +0800 # “---”表示旧文件
+++ new.c 2016-08-19 22:06:23.101898395 +0800 # “+++”表示新文件
@@ -1,6 +1,6 @@ # 块,表示要修改的位置。“-”表示要删除的;“+”表示要增加的
 #include <stdio.h>

 int main(void) {
-  printf("old");
+  printf("new");
   return 0;
 }

可重定向来生成补丁文件:

$ diff -u old.c new.c > a.patch

生成的补丁文件用patch命令即可对旧的代码打补丁。

2 patch

用法:

patch -p0 补丁文件

-p0表示从当前目录搜索改动的文件。

-p1表示忽略第一层目录。

比如源文件路径是old/module/a.c,改动后的是new/module/a.c,那么-p1时,从当前目录下的module开始应用补丁。如果是-p0,则是从当前目录下的old目录下开始应用。

接上例,执行:

patch -p0 < a.patch

old.c中对应的行就被修改成了new.c对应的内容。

patch是直接对原始文件进行写操作,如果打补丁打出问题,还可以撤销补丁:

patch -p0 -E < a.patch