看懂diff的结果

diff是个用的比较多的东西,只要支持就还是很好用的东西,这篇博客就是记录一下如何看懂diff的结果。

diff有三种格式:

    正常格式

    上下文格式

    合并格式

为了方便理解这里创建两个文件a.txt,b.txt

a.txt:

1234567
大家好我是a.txt
大家好我是a.txt
大家好我是a.txt
abcdefg

b.txt:

1234567
大家好我是b.txt
大家好我是b.txt
大家好我是b.txt
大家好我是b.txt
abcdefg

如果两个文件是没有区别的,那么一般是不会有输出的。

依次来看各种模式间的区别,已经每种输出的意义。

正常格式:

$ diff a.txt b.txt

这时diff正常格式的输出结果如下(由四块组成):

2,4c2,5
< 大家好我是a.txt
< 大家好我是a.txt
< 大家好我是a.txt
---
> 大家好我是b.txt
> 大家好我是b.txt
> 大家好我是b.txt
> 大家好我是b.txt

第一行表明了变动位置(第一块)。2,4c2,5。它由三个部分组成:前面的2,4表明a.txt的2-4行有变化;

中间c表明变动的模式是内容改变(change)(其它模式还有"增加"a(append),"删除"d(delete));

后面的2,5表明改动后变成b.txt的2-5行。

然后后面共三行(第二块):

< 大家好我是a.txt
< 大家好我是a.txt
< 大家好我是a.txt

每行由两部分组成:< 内容。

前面的左尖括号(<)表示要从a.txt中删除改行,改行的内容是什么。每行对应一行输出。

然后再是一行 ---(第三块),这个没有特殊意义,只是起到一个分隔作用。

然后后面有四行(第四块):

> 大家好我是b.txt
> 大家好我是b.txt
> 大家好我是b.txt
> 大家好我是b.txt

和前面的第二块比较相似,前面的右尖括号(>)表明要在b.txt中追加这行,这行的内容是什么,每行对应一行输出。

上下文格式:

$ diff -c a.txt b.txt

与正常格式相比只是添加了个参数c(context)。

这时的输出内容如下:

*** a.txt       2018-02-21 19:12:36.548904412 +0800
--- b.txt       2018-02-21 19:14:53.986702916 +0800
***************
*** 1,5 ****
  1234567
! 大家好我是a.txt
! 大家好我是a.txt
! 大家好我是a.txt
  abcdefg
--- 1,6 ----
  1234567
! 大家好我是b.txt
! 大家好我是b.txt
! 大家好我是b.txt
! 大家好我是b.txt
  abcdefg

这个结果也是四块。

第一块由前面两行组成,显示两个文件的基本情况:比如文件名和时间。

*** a.txt       2018-02-21 19:12:36.548904412 +0800
--- b.txt       2018-02-21 19:14:53.986702916 +0800

第二块是15个星号组成。同样是起分割作用。

第三块是显示变动前的文件内容,即a.txt。

*** 1,5 ****
  1234567
! 大家好我是a.txt
! 大家好我是a.txt
! 大家好我是a.txt
  abcdefg

这时不仅是变化的那几行会显示出来还会额外显示一部分,注意不要看这里是全部打印了就以为全部显示,

其实只显示变化了的前三行和后三行,这里因为内容比较少所以全部打印了,读者可以自己去尝试看看效果。

这上三行和下三行其实就是所谓的上下文了。

这一块也比较好理解,前面第一行也是变动的位置,然后每一行前面有一个空标记如果为空,则表示没有变动,

如果为感叹号(!)则表示发生了变化,如果为加号(+)则表示改行为新增行,如果为减号(-)则表示改行被删除。

第四块就是变动后的文件内容,即b.txt。

--- 1,6 ----
  1234567
! 大家好我是b.txt
! 大家好我是b.txt
! 大家好我是b.txt
! 大家好我是b.txt
  abcdefg

每行意义和第三块差不多,应该好理解。

合并格式:

如果两个文件相似度较高,那么上下文格式会有大量重复内容,所以又引入了合并格式。

$ diff -u a.txt b.txt
使用方法为添加u(unified)参数。

此时打印结果如下:

--- a.txt       2018-02-21 19:12:36.548904412 +0800
+++ b.txt       2018-02-21 19:14:53.986702916 +0800
@@ -1,5 +1,6 @@
 1234567
-大家好我是a.txt
-大家好我是a.txt
-大家好我是a.txt
+大家好我是b.txt
+大家好我是b.txt
+大家好我是b.txt
+大家好我是b.txt
 abcdefg

前面两行和上下文一样是文件相关信息。下面打印出来的内容也和上下文差不多,

除了有变动的内容以外,也是多打印上三行和下三行,但是它将两个文件内容合并在一起显示,所以叫"合并格式"。

每一行最前的仍是标准位:空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。

这些和上下文格式都差不多,主要新增的区别是中间那部分,被@@夹着的内容。

前面-1,5分成三个部分:减号表示第一个文件(即a.txt),1表示第一行,5表示连续5行。合并在一起,就表示下面是

第一个文件从第一行开始的连续5行。同样的后面的+1,6表示下面是第二个文件从第一行开始的连续6行。

注意前面两种格式的m,n都是从第m行到第n行,而这里是从第m行开始的连续n行。

Git格式的diff:

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

$ git diff 

显示结果如下:

diff --git a/a.txt b/b.txt
index 2b875e9..4636b73 100644
--- a/a.txt
+++ b/b.txt
@@ -1,5 +1,6 @@
 1234567
-大家好我是a.txt
-大家好我是a.txt
-大家好我是a.txt
+大家好我是b.txt
+大家好我是b.txt
+大家好我是b.txt
+大家好我是b.txt
 abcdefg

第一行表示结果为git的diff。进行比较的是:a版本的a.txt(即变动前)和b版本的b.txt(即变动后)。

第二行表示两个版本的git哈希值(index区域的2b875e9对象,与工作目录区域的4636b73对象进行比较),

    最后六位数是对象的模式(普通文件,644权限)。

第三行~第四行表示进行比较的两个文件。"---"表示变动前,"+++"表示变动后。

后面的行和合并格式的diff都一样。


参考文献:读懂diff http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值