diff教程!

diff是Unix系統的一個很重要的工具程序。
它用來比較兩個文本文件的差異,是代碼版本管理的基石之一。你在命令行下,輸入:
  $ diff <變動前的文件> <變動后的文件>

diff就會告訴你,這兩個文件有何差異。它的顯示結果不太好懂,下面我就來說明,如何讀懂diff。
[圖片上傳中。。。(1)]
一、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
現在對f1和f2進行比較:
  $ diff f1 f2

這時,diff就會顯示正常格式的結果:
  4c4  < a  ---  > b

第一行是一個提示,用來說明變動位置。
  4c4

它分成三個部分:前面的"4",表示f1的第4行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);后面的"4",表示變動后變成f2的第4行。
第二行分成兩個部分。
  < a

前面的小于號,表示要從f1當中去除該行(也就是第4行),后面的"a"表示該行的內容。
第三行用來分割f1和f2。
  ---

第四行,類似于第二行。
  > b

前面的大于號表示f2增加了該行,后面的"b"表示該行的內容。
最早的Unix(即AT&T版本的Unix),使用的就是這種格式的diff。
四、上下文格式的diff
上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,覺得diff的顯示結果太簡單,最好加入上下文,便于了解發生的變動。因此,推出了上下文格式的diff。
它的使用方法是加入c參數(代表context)。
  $ 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行。
五、合并格式的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的變體。
  $ 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/f1 b/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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • diff是Unix系統的一個很重要的工具程序。 它用來比較兩個文本文件的差異,是代碼版本管理的基石之一。你在命令行...
    石樂志的LK閱讀 282評論 0 0
  • 作者: 阮一峰日期: 2012年8月29日 diff是Unix系統的一個很重要的工具程序。它用來比較兩個文本文件的...
    JasonQiao閱讀 393評論 0 0
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,589評論 9 467
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,239評論 2 33
  • 我終于去看了這部已經褪去了熱度的電影。 舞臺劇的轉型 不知道是因為我逐漸了解了世界的多元化,還是真的「音樂劇」在紅...
    少女冉閱讀 304評論 2 3