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
网友评论