首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。

diff

NAME

diff - find differences between two files

SYNOPSIS

diff [options] from-file to-file

简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

diff是Unix系统的一个很重要的工具程序。

它用来比较两个文本文件的差异,是代码版本管理的基石之一。你在命令行下,输入:

$ diff

diff就会告诉你,这两个文件有何差异。它的显示结果不太好懂,下面我就来说明,如何读懂diff。

一、diff的三种格式

由于历史原因,diff有三种格式:

* 正常格式(normal diff)

* 上下文格式(context diff)

* 合并格式(unified diff)

我们依次来看。

二、示例文件

为了便于讲解,先新建两个示例文件。

第一个文件叫做f1,内容是每行一个a,一共7行。

a

a

a

a

a

a

a

第二个文件叫做f2,修改f1而成,第4行变成b,其他不变。

a

a

a

b

a

a

a

三、正常格式的diff

现在对f1和f2进行比较:

$ diff f1 f2

这时,diff就会显示正常格式的结果:

4c4

< a

---

> b

第一行是一个提示,用来说明变动位置。

4c4

它分成三个部分:前面的"4",表示f1的第4行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);后面的"4",表示变动后变成f2的第4行。

第二行分成两个部分。

< a

前面的小于号,表示要从f1当中去除该行(也就是第4行),后面的"a"表示该行的内容。

第三行用来分割f1和f2。

---

第四行,类似于第二行。

> b

前面的大于号表示f2增加了该行,后面的"b"表示该行的内容。

最早的Unix(即AT&T版本的Unix),使用的就是这种格式的diff。

四、上下文格式的diff

上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。

它的使用方法是加入c参数(代表context)。

$ diff -c f1 f2

显示结果如下:

*** f1 2012-08-29 16:45:41.000000000 +0800

--- f2 2012-08-2916:45:51.000000000 +0800

***************

*** 1,7 ****

a

a

a

!a

a

a

a

--- 1,7 ----

a

a

a

!b

a

a

a

这个结果分成四个部分。

第一部分的两行,显示两个文件的基本情况:文件名和时间信息。

*** f1 2012-08-29 16:45:41.000000000 +0800

--- f2 2012-08-2916:45:51.000000000 +0800

"***"表示变动前的文件,"---"表示变动后的文件。

第二部分是15个星号,将文件的基本情况与变动内容分割开。

***************

第三部分显示变动前的文件,即f1。

*** 1,7 ****

a

a

a

!a

a

a

a

这时不仅显示发生变化的第4行,还显示第4行的前面三行和后面三行,因此一共显示7行。所以,前面的"*** 1,7 ****"就表示,从第1行开始连续7行。

另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。

第四部分显示变动后的文件,即f2。

--- 1,7 ----

a

a

a

!b

a

a

a

除了变动行(第4行)以外,也是上下文各显示三行,总共显示7行。

五、合并格式的diff

如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。

它的使用方法是加入u参数(代表unified)。

$ diff -u f1 f2

显示结果如下:

---f1 2012-08-29 16:45:41.000000000 +0800

+++ f2 2012-08-2916:45:51.000000000 +0800

@@ -1,7 +1,7 @@

a

a

a

-a

+b

a

a

a

它的第一部分,也是文件的基本信息。

---f1 2012-08-29 16:45:41.000000000 +0800

+++ f2 2012-08-2916:45:51.000000000 +0800

"---"表示变动前的文件,"+++"表示变动后的文件。

第二部分,变动的位置用两个@作为起首和结束。

@@ -1,7 +1,7 @@

前面的"-1,7"分成三个部分:减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。

第三部分是变动的具体内容。

a

a

a

-a

+b

a

a

a

除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

六、diff的用法:即打补丁

[root@linuxidc /app]# diff -u f1 f2 > diff.log  #生成补丁文件diff.log

[root@linuxidc /app]# cat diff.log

--- f1  2017-10-13 18:12:51.604871346 +0800  #变动前文件

+++ f2  2017-10-13 18:13:15.905871332 +0800  #变动后文件

@@ -1,7 +1,7 @@                    #用两个@作为起首和结束,-1,7:第一个文件从第一行开始的连续七行;+1,7:第二个文件从第一行开始的连续七行

a

a

a  # 前面空表示无变动

-      a  # 减号表示第一个文件删除的行

+      b  # 加号表示第二个文件新增的行    ,即第一个文件和第二个文件就区别在第二个文件将第一个文件里的a换成了b

a

a

a

[root@linuxidc /app]#

七、还原补丁

[root@linuxidc /app]# ls                        #先查看一下此时的文件列表

diff.log  f1  f2  test

[root@linuxidc /app]#

[root@linuxidc /app]# patch -b f1 diff.log        #还原补丁,用f1,f2都可以

patching file f1

[root@linuxidc /app]# ls

diff.log  f1  f1.orig  f2  test                  #可以看到f1自动生成了一个f1.orig的文件

[root@linuxidc /app]#

[root@linuxidc /app]# cat f1                      #现在f1里放的是f2的文件

a

a

a

b

a

a

a

[root@linuxidc /app]# cat f1.orig              #f1原有的文件被备份到了f1.orig文件里

a

a

a

a

a

a

a

[root@linuxidc /app]# mv f2 f2.orig            # 将f2文件改名为f2.orig(为了跟还原的文件比较)

[root@linuxidc /app]# ls

diff.log  f1  f1.orig  f2.orig  test

[root@linuxidc /app]# diff f1 f2.orig          # 没有任何信息输出,表示两个文件内容完全一样

[root@linuxidc /app]#

[root@linuxidc /app]# patch -b f2 diff.log      #借助f2还原也可以,只不过出现以下提示信息(第一次看见以为是报错信息呢)

patching file f2

Reversed (or previously applied) patch detected!  Assume -R? [n] y    #输入“y”回车就可以了

[root@linuxidc /app]# ls

diff.log  f1  f2  f2.orig  test

[root@linuxidc /app]# cat f2

a

a

a

a

a

a

a

[root@linuxidc /app]# cat f2.orig

a

a

a

b

a

a

a

[root@linuxidc /app]#

linux diff 补丁,Linux中diff、补丁的用法及介绍相关推荐

  1. linux shell ifeq,Makefile 中 ifeq ifneq 等用法

    (1)ifeq的用法 ifeq ($(变量名), 变量值 ) ........ else ifeq ($(..), ..) ......... else ......... endif (2)最近在学 ...

  2. linux diff patch 生成和打补丁

    通过diff工具生成补丁, patch工具打上补丁. 在使用diff之前, 你需要保留一份未修改过的源码, 然后在其它地方修改源码的一份拷贝. diff对比这两份源码生成patch. 修改过的源码必须 ...

  3. Linux使用diff对比文件差异,生成补丁,patch打补丁

    目录 1.概述 2.使用diff对比单个文件差异 3.diff命令常用选项: 4.使用patch命令对单文件代码打补丁 5.对比目录中所有文件的差异 1.概述 程序是人设计出来的,总是会有这样那样的问 ...

  4. linux生成目录间补丁,Linux文件比对工具,Linux diff的用法,Linux补丁制作,patch用法...

    diff通常在于比对同个文件不同版本之间的差异,不同文件没意义,因为差异都会出来 用法 diff [-bBi] from-file to-file -b忽略一行当中多个空白符号的差异 例如about ...

  5. 代码打补丁的利器——diff和patch

    一般来说,如果我们在研发过程中需要对代码进行修改,是不需要通过打补丁的方式的,因为我们可以直接改动文件即可.但是如果针对一款要上线的产品,我们总不能在研发的电脑上编译通过后直接发布到线上的.(转载请指 ...

  6. 谈谈Linux打补丁的原理以及如何判别打补丁的错误 --- 从补丁学内核

    补丁有几种方式: 1. 替换原有的EXE或DLL文件 2. 通过汇编码直接修改原来的EXE或DLL(豪杰就这么干过,太厉害了) 3. 修改注册表或INI文件以支持新格式文件 以上三种方法可单独使用或联 ...

  7. git diff与linux diff的输出格式之unified format

    前言 前面有一篇文章<一个有些意思的项目--文件夹对比工具(一)>,里面简单讲了下diff算法之--Myers算法. 既然是算法,就会有实现,比如git diff中有Myers的实现,gi ...

  8. 谈谈Linux打补丁的原理以及如何判别打补丁的错误 --- 从补丁学内核

    对于长期使用Linux的童鞋来说,不说有没有打过补丁,至少这个词大家并不陌生,下面我们通过一个实例来说说: 前几天接触了TQ3358这块天嵌的ARM板子,想给它装个实时Linux并做测试,在自带的光盘 ...

  9. <Linux>使用quilt工具制作补丁(patch)文件

    Linux使用quilt工具制作补丁文件 前言 一.安装quilt工具 二.一个需要被打补丁的文件 三.quilt new命令创建初始补丁文件 四.quilt add命令添加目标文件 五.修改目标文件 ...

最新文章

  1. boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
  2. [PHP] PHP调用IMAP协议读取邮件类库
  3. Listview中使用线程实现无限加载更多项目的功能
  4. 通过反射越过泛型检查
  5. node --- 在express中配置使用模板引擎(art-template)
  6. [SAP ABAP开发技术总结]权限对象检查
  7. Dynamo论文导读
  8. 奇怪的DNS问题,虚拟机下可以,真实的环境却出错,希望大家帮助下
  9. 交叉编译iproute2
  10. git version可以卸载吗_sourcetree使用:问题是有推送提示,但显示为空。原因:git版本过低...
  11. nyoj 8 一种排序(用vector,sort,不用set)
  12. Windows认证协议
  13. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列一之综述简介,硬盘分区
  14. form表单内子元素组件按钮button事件冲突 - Vue
  15. crontab使用实例
  16. hdu2197 本源串
  17. Charles抓包的使用步骤
  18. git clean 命令详解
  19. 手撕面试官的OKhttp连环炮击~
  20. R语言swirl教程(R Programming)13——Simulation

热门文章

  1. 对话MySQL之父:代码一次性完成才是优秀程序员
  2. 高频一线大厂Python面试题:算法+爬虫+数据处理+基础
  3. 云+社区「开源之道」主题直播,这些技术大佬都说了哪些干货?
  4. Python让你成为AI 绘画大师,简直太惊艳了!(附代码)
  5. QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划
  6. 十万开发者票选,顶级当红讲师来了!
  7. 航拍高手、吉他十级,6500+Star 开源项目作者,后浪程序员给力!
  8. Java 跌落神坛,Python 继续夺冠....凭啥?
  9. Java败给Python?不!我有话说
  10. 朋友圈新增访客记录?大众点评辟谣”被放弃”;百度 7 款 APP 进入 App Store 前十 | 极客头条...