Git diff 結果解讀


Git diff 結果解讀


1.diff的三種格式
由於歷史原因,diff有三種格式:

  • 正常格式(normal diff)
  • 上下文格式(context diff)
  • 合並格式(unified diff)

我們依次來看.


2.**示例文件** 為了便於講解,先新建兩個示例文件. 第一個文件叫做f1,內容是每行一個a,一共7行. ``` a a a a a a a ```

第二個文件叫做f2,修改f1而成,第4行變成b,其他不變.

a
a
a
b
a
a
a

3.**正常格式的diff** 最早的Unix(即AT&T版本的Unix),使用的就是這種格式的diff. ***--cmd--*** `$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"表示該行的內容.
4.**上下文格式的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行.
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 ```


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM