美文网首页
读懂diff

读懂diff

作者: ljt001 | 来源:发表于2022-11-16 11:54 被阅读0次

    转自:看懂diff的结果
    读懂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

    相关文章

      网友评论

          本文标题:读懂diff

          本文链接:https://www.haomeiwen.com/subject/emyyxdtx.html