读懂diff(代码片段)

dion至君 dion至君     2022-10-21     488

关键词:

 

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

我们比较下两个文件。

 $ diff f1 f2

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

   4c4
  < a
  ---
  > b

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

四、上下文格式的diff

上下文格式的diff,它的使用方法是加入c参数(代表context)。是上个世纪80年代加州大学伯里克分校推出的。

$ 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

  

五、合并格式的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的变体。

 

七、参考资料:

  * diff - Wikipedia

  * How to read a patch or diff

  * How to work with diff representation in git

       *读懂diff

读懂diff

 转自:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html作者: 阮一峰日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的基石之一。你在命令行下,输入... 查看详情

git(代码片段)

-git本地版本回退与远端版本回退(回滚)-tsq292978891的博客-CSDN博客Git-BookGit查看版本改动——gitdiff-AsheAndWine的博客-CSDN博客读懂diff-阮一峰的网络日志sudoaptinstallgitgitinitgitadd.gitcommit-am1gitlog--pretty=onelinegitreset--hardHEAD^ 查看详情

sh混帐:diff(代码片段)

查看详情

[1].array.diff(代码片段)

DescriptionYourgoalinthiskataistoimplementadifferencefunction,whichsubtractsonelistfromanotherandreturnstheresult.Itshouldremoveallvaluesfromlista,whicharepresentinlistb,suchasarray_diff([1,2],[1])==[ 查看详情

深入理解react:diff算法(代码片段)

目录序言React的核心思想传统diff算法Reactdiff两个假设三个策略diff具体优化treediffcomponentdiffelementdiff小结参考1.序言此篇文章所讨论的是React16以前的Diff算法。而React16启用了全新的架构Fiber,相应的Diff算法也有所改变,不在这篇文... 查看详情

elasticsearch一文读懂(代码片段)

目录1、Elasticsearch简介2、Docker安装 Elasticsearch2.1使用Docker安装ElasticSearch7.6.22.2Elasticsearch目录详解2.3 使用Docker安装elasticSearch--head通过Chrome插件安装ElasticSearch-head  2.4了解ELKELK功能结构图Docker安装Kibana 3ElasticSe 查看详情

modelmapper一文读懂(代码片段)

目录1、ModelMapper简介1.1引入ModelMapper的依赖 1.2进行Mapping映射1.3ModelMapper工作原理 2、ModelMapper基础操作 2.1ModelMapper基本映射2.2  ModelMapper集合转换 2.3  ModelMapper指定默认值 2.4  ModelMapper属性值转换 2.5  ModelMapper属性值跳过 ... 查看详情

markdownyaml-diff.md(代码片段)

查看详情

pythoncsv_diff.py(代码片段)

查看详情

phpphparray_diff()完全比较(代码片段)

查看详情

sh用diff创建一个补丁(代码片段)

查看详情

swiftlcs-diff.swift(代码片段)

查看详情

fastdfs一文读懂(代码片段)

目录FastDFS介绍FastDFS概念FastDFS作用FastDFS优缺点 FastDFS相关概念FastDFS原理FastDFS系统拓扑图FastDFS核心工作流程FastDFS文件上传FastDFS文件下载 Linux环境搭建FastDFSDocker环境搭建FastDFSSpringBoot封装FastDFS功能模块FastDFS介绍FastDFS概念FastDFS... 查看详情

mapstruct一文读懂(代码片段)

目录1、MapStruct简介1.1MapStructMaven引入 2、MapStruct基础操作 2.1MapStruct基本映射 2.2MapStruct指定默认值2.3MapStruct表达式2.4MapStruct时间格式2.5MapStruct数字格式3、MapStruct组合映射3.1多参数源映射3.2使用其他参数值 3.3嵌套映射  3.4 逆... 查看详情

ruby无花果diff.rb(代码片段)

查看详情

[转帖]一文读懂http/2(代码片段)

一文读懂HTTP/2http://support.upyun.com/hc/kb/article/1048799/又小拍 ? 发表于:2017年05月18日15:34:45 ? 更新于:2017年05月24日15:06:11今天,HTTP1.1已经变成互联网中主要的协议。但是在HTTP协议诞生初期却被认为是简单直接的协议... 查看详情

xtools(代码片段)

xtools-----标准数据统计,主要是命令次数的统计,transactioninsCom_insert(diff)updCom_update(diff)delCom_delete(diff)selCom_select(diff)tpsCom_insert+Com_update+Com_delete(diff)-----线程处理,threadsrunThreads_runningconThrea 查看详情

myers‘diff之线性空间细化(代码片段)

Myers’diff前言在学习完上一篇文章Myers’Diff之贪婪算法之后,我对Android源码中的DiffUtil类进行了阅读发现其算法的实现和文章中的方式并不尽相同,而是在其基础之上再次进行的优化。所以本篇文章是以上一篇Myers’Diff... 查看详情