您的位置:首页 > 其它

diff、patch的用法

2016-11-16 14:55 316 查看
          最近几天再看uboo和linux内核源码,上来第一条:你要会打补丁吧!

          之前用git时用过diff,和Linux命令中的diff其实是一个东西。当我们比较同一个软件的不同版本时,会用到diff。

          diff一般处理纯文本文件,且以一行为单位进行比较处理的。先来看看diff的usage(详细用法可以自行man diff):

 diff   [-bBi]   from-file   to-file

选项和参数:

                     from-file :作为原始比对文档的档名;

                     to-file         作为目的比对文档的档名;        注意,from-file 和 to-file 可以 用 - 取代, 代表『Standard input』。

        -b :忽略一行中仅有空白字符的差异,即忽略空白符

        -B :忽略空白行的差异。

         -i :忽略大小写的不同。

光说不练假把式,写个文本文件来体验下diff吧。我这里已经写过好了两个.c文件

example.c

#include "stdio.h"

int main(int argc, char *argv[])
{
printf("hello CentOS_6!\n");

return 0;

}

example_new.c
#include "stdio.h"

#define MAX_VALUE 99

int main(int argc, char* argv[])
{
int i =0;
for(; i < MAX_VALUE; i ++)
{
printf("This is %d times\n", i);
}

return 0;
}

执行diff看看:
[fc@localhost Documents]$ diff example.c example_new.c
3c3,5 //左边example.c的第三行被右边example_new.c的第3-5行替换
< int main(int argc, char *argv[]) //并列出example.c的第三行
---
> #define MAX_VALUE 99 //列出example_new.c的第3-5行
>
> int main(int argc, char* argv[])
5c7,11 //同上啦,不解释
< printf("hello CentOS_6!\n");
---
> int i =0;
> for(; i < MAX_VALUE; i ++)
> {
> printf("This is %d times\n", i);
> }
8d13 //example.c的第8行被删除,基准是右边的第13行
<
       既然有了 diff了,刚刚分析了example.c的两个版本了,如果现在想把旧的文档升级成新的文档,该咋整呢?Linux下传统的做法是先比较新旧版本的差异,再将差异文件制作成为补丁文件,再由补丁文件更新旧文件。
[fc@localhost Documents]$ diff -Naur example.c example_new.c >example.patch
[fc@localhost Documents]$ cat example.patch
--- example.c 2016-11-15 21:50:37.827008246 -0800
+++ example_new.c 2016-11-15 21:56:11.722007726 -0800
@@ -1,9 +1,14 @@
#include "stdio.h"

-int main(int argc, char *argv[])
+#define MAX_VALUE 99
+
+int main(int argc, char* argv[])
{
- printf("hello CentOS_6!\n");
+ int i =0;
+ for(; i < MAX_VALUE; i ++)
+ {
+ printf("This is %d times\n", i);
+ }

return 0;
-
}


      由上可知,一般我们用diff做出来的补丁文件就以.patch后缀,patch命令再用这个.patch文件更新旧文档,它看到 - 会删除,看到 + 会加入。还是先来看看patch的用法:
 patch -pN < patch_file <==更新

 patch -R -pN < patch_file <==还原

选项和参数:

                     -p :后面表示忽略几层目录。

                     -R :代表还原,将新文件还原成旧的版本。

[fc@localhost Documents]$ patch -p0 < example.patch
patching file example.c
[fc@localhost Documents]$ cat example.c
#include "stdio.h"

#define MAX_VALUE 99

int main(int argc, char* argv[])
{
int i =0;
for(; i < MAX_VALUE; i ++)
{
printf("This is %d times\n", i);
}

return 0;
}
     可以看到打过补丁后example.c与example_new.c一样了。
     现在再来个版本回滚:
[fc@localhost Documents]$ patch -R -p0 < example.patch
patching file example.c
[fc@localhost Documents]$ cat example.c
#include "stdio.h"

int main(int argc, char *argv[])
{
printf("hello CentOS_6!\n");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  diff patch 补丁