2.示例文件
爲了便於講解,先新建兩個示例文件。第一個文件叫作f1,內容是每行一個a,一共7行。git
a
a
a
a
a
a
a
第二個文件叫作f2,修改f1而成,第4行變成b,其餘不變。spa
a
a
a
b
a
a
a
3.正常格式的diff
最先的Unix(即AT&T版本的Unix),使用的就是這種格式的diff.code
$diff f1 f2
這時,diff就會顯示正常格式的結果:orm
4c4 < a - > b
第一行是一個提示,用來講明變更位置.
4c4
它分紅三個部分:前面的"4″,表示f1的第4行有變化,中間的"c"表示變更的模式是內容改變(change),其餘模式還有"增長"(a,表明addition)和"刪除"(d,表明deletion),後面的"4″,表示變更後變成f2的第4行.對象
第二行分紅兩個部分.
< a
前面的小於號,表示要從f1當中去除該行(也就是第4行),後面的"a"表示該行的內容.blog
第三行用來分割f1和f2.
-
get
第四行,相似於第二行.
> b
前面的大於號表示f2增長了該行,後面的"b"表示該行的內容.it
4.上下文格式的diff
上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,以爲diff的顯示結果太簡單,最好加入上下文,便於瞭解發生的變更.所以,推出了上下文格式的diff.io
它的使用方法是加入c參數(表明context).class
$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行.
5.合併格式的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行.它將兩個文件的上下文,合併顯示在一塊兒,因此叫作"合併格式".每一行最前面的標誌位,空表示無變更,減號表示第一個文件刪除的行,加號表示第二個文件新增的行.
6.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/f1b/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