$ diff <變動前的文件> <變動後的文件>diff就會告訴你,這兩個文件有何差異。它的顯示結果不太好懂,下面我就來說明,如何讀懂diff。
* 正常格式(normal diff) * 上下文格式(context diff) * 合並格式(unified diff)我們依次來看。
a第二個文件叫做f2,修改f1而成,第4行變成b,其他不變。
a
a
a
a
a
a
a
a
a
b
a
a
a
$ 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 -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"***"表示變動前的文件,"---"表示變動後的文件。 第二部分是15個星號,將文件的基本情況與變動內容分割開。
--- f2 2012-08-29 16:45:51.000000000 +0800
***************第三部分顯示變動前的文件,即f1。
*** 1,7 ****這時不僅顯示發生變化的第4行,還顯示第4行的前面三行和後面三行,因此一共顯示7行。所以,前面的"*** 1,7 ****"就表示,從第1行開始連續7行。 另外,文件內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感歎號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。 第四部分顯示變動後的文件,即f2。
a
a
a
!a
a
a
a
--- 1,7 ----除了變動行(第4行)以外,也是上下文各顯示三行,總共顯示7行。
a
a
a
!b
a
a
a
$ 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除了有變動的那些行以外,也是上下文各顯示3行。它將兩個文件的上下文,合並顯示在一起,所以叫做"合並格式"。每一行最前面的標志位,空表示無變動,減號表示第一個文件刪除的行,加號表示第二個文件新增的行。 六、git格式的diff 版本管理系統git,使用的是合並格式diff的變體。
a
a
-a
+b
a
a
a
$ git diff顯示結果如下:
diff --git a/f1 b/f1第一行表示結果為git格式的diff。
index 6f8a38c..449b072 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a
diff --git a/f1 b/f1進行比較的是,a版本的f1(即變動前)和b版本的f1(即變動後)。 第二行表示兩個版本的git哈希值(index區域的6f8a38c對象,與工作目錄區域的449b072對象進行比較),最後的六位數字是對象的模式(普通文件,644權限)。
index 6f8a38c..449b072 100644第三行表示進行比較的兩個文件。
--- a/f1"---"表示變動前的版本,"+++"表示變動後的版本。 後面的行都與官方的合並格式diff相同。
+++ b/f1
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a