读懂diff

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-29 16: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-29 16: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-29 16: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-29 16: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行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

六、git格式的diff

版本管理系统git,使用的是合并格式diff的变体。

  $ git diff

显示结果如下:

  diff --git a/f1 b/f1
index 6f8a38c..449b072 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a

第一行表示结果为git格式的diff。

  diff --git a/f1 b/f1

进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。

第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。

  index 6f8a38c..449b072 100644

第三行表示进行比较的两个文件。

  --- a/f1
+++ b/f1

"---"表示变动前的版本,"+++"表示变动后的版本。

后面的行都与官方的合并格式diff相同。

  @@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a

七、阅读材料

  * diff - Wikipedia

  * How to read a patch or diff

  * How to work with diff representation in git

(完)

时间: 2024-09-07 22:30:19

读懂diff的相关文章

diff详解,读懂diff结果

  阅读目录 1.概述 2.diff如何工作,如何理解diff的执行结果 3.Normal模式 4.Context模式 5.Unified模式 6.比较目录 7.一些有用的参数 回到顶部 1.概述 本文将要讨论的是diff命令,diff用来比较两个文件.当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在windows下工作,这些GUI的比较工具绝对是首选.对于在lin

来自大数据的反思:需要你读懂的10个小故事(一)

[编者按]这是近一年前<2015-07-28>发表于CSDN的文章这里归集此处仅作存档. 自2011年以来大数据旋风以"迅雷不及掩耳之势"席卷中国.毋庸置疑大数据已然成为继云计算.物联网之后新一轮的技术变革热潮不仅是信息领域经济.政治.社会等诸多领域都"磨刀霍霍"向大数据准备在其中逐得一席之地. 中国工程院李国杰院士更是把大数据提升到战略的高度他表示[1]数据是与物质.能源一样重要的战略资源.从数据中发现价值的技术正是最有活力的软技术在数据技术与产业上的

网站设计经验原则:让你的网站容易读懂

文章简介:正确的背景风格可以为整个网站确定基调.我们搜集了一批使用大幅图像.明亮颜色或出众图案来作为背景的优秀网站,希望从中探寻当下网站的流行设计风格. 正确的背景风格可以为整个网站确定基调.我们搜集了一批使用大幅图像.明亮颜色或出众图案来作为背景的优秀网站,希望从中探寻当下网站的流行设计风格. 什么样的背景最适合你的网站,这并没有一定之规,但确实有一些共同的要素: 互联网背景的内容应该有目的性. 背景应该与你的品牌风格一致. 背景之上的文字内容应该易于阅读(无论是颜色.反差还是尺寸大小.) 背

产品设计:读懂iPad 的工业设计

By PJesus Diaz from Gizmodo sillymouse 译, Boday 校, 转载请注明 ifanr.com 译文链接. 译注: ipad上市以来各大媒体充满了各种评论.虽然很多都是溢美之词,但是仍然不能抹杀优秀文章的价值.这一篇就是如此,这是 Gizmodo 的一篇关于 iPad 工业设计的文章,评价甚高,我们翻译此文并不代表完全认同其观点. 苹果公司的最新产品 iPad 很好地诠释了 Dieter Rams 著名的"优秀设计的十大准则",这十条金科玉律是每一

【2万赞】一文读懂深度学习(附学习资源)

Image credit: Datanami   人工智能(AI)和机器学习(ML)都属于目前最热门的话题. 在日常生活中,AI这个术语我们随处可见.你或许会从立志高远的开发者那里听说她(他)们想要学习AI.你又或许会从运营者那里听到他们想要在他们的的服务中实施AI.但往往这些人中的绝大多数都并不明白什么是AI. 在你阅读完这篇文章之后,你将会了解AI和ML的基本知识.而更重要的是,你将会明白深度学习(https://en.wikipedia.org/wiki/Deep_learning),这类

一文让你迅速读懂Serverless

本文讲的是一文让你迅速读懂Serverless[编者的话]Serverless架构,或者称为无服务器架构,是最近几年新冒出来的一种架构风格.本文主要介绍的是Serverless下包含的两个概念:FaaS.BaaS. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览:持续集成系统介绍:客户端与服务端的 CI/CD 实践:开发流程中引入 CI.CD:Gitlab 和 CI.CD 工具

【一文读懂AlphaGo Zero算法】白话蒙特卡洛树搜索和ResNet

AlphaGo Zero 令人惊艳.不过,有些评论似乎渲染过度,把它的算法说得神乎其神.大数医达创始人,CMU计算机学院暨机器人研究所博士邓侃在本文中,尝试用大白话,通俗地解释 AlphaGo Zero,弄清楚蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS).深度学习启发函数和置信上限这三大核心概念. AlphaGo Zero 引起巨大社会轰动 只告诉机器围棋的基本规则,但是不告诉它人类摸索了上千年才总结出来的定式等围棋战术,让机器完全依靠自学,打败人类.这个题目不仅

【一文读懂Hinton最新Capsules论文】CNN 未来向何处去

Hinton 上周发表的一篇论文 Dynamic Routing Between Capsules 提出用 Capsule 这个概念代替反向传播,引起广泛关注,大数医达创始人,CMU计算机学院暨机器人研究所博士邓侃用浅显的语言梳理解读了论文.邓侃认为,capsule 作为视觉数学表征,很可能是为了把视觉,听觉.阅读的原本相互独立的数学向量,统一起来,完成多模态机器学习的终极目标. CNN 未来向何处去? 做领袖不容易,要不断地指明方向.所谓正确的方向,不仅前途要辉煌,而且道路要尽可能顺畅. G

独家 | 一文读懂Hadoop(四):YARN

随着全球经济的不断发展,大数据时代早已悄悄到来,而Hadoop又是大数据环境的基础,想入门大数据行业首先需要了解Hadoop的知识.2017年年初apache发行了Hadoop3.0,也意味着一直有一群人在对Hadoop不断的做优化,不仅如此,各个Hadoop的商业版本也有好多公司正在使用,这也印证了它的商业价值. 读者可以通过阅读"一文读懂Hadoop"系列文章,对Hadoop技术有个全面的了解,它涵盖了Hadoop官网的所有知识点,并且通俗易懂,英文不好的读者完全可以通过阅读此篇文