Git diff 結果解讀

2023-01-04 10:36:02 字數 3550 閱讀 3343

1.diff的三種格式

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

我們依次來看.

2.**示例檔案**

為了便於講解,先新建兩個示例檔案.

第一個檔案叫做f1,內容是每行一個a,一共7行.

```aaa

aaaa

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

aaa

baaa

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 ****aa

a!aaa

a- 1,7 --aa

a!baa

a

這個結果分成四個部分.

第一部分的兩行,顯示兩個檔案的基本情況:檔名和時間資訊.

*** f1 2012-08-29 16:45:41.000000000 +0800

- f2 2012-08-29 16:45:51.000000000 +0800

"***"表示變動前的檔案,"-"表示變動後的檔案.

> 第二部分是15個星號,將檔案的基本情況與變動內容分割開.

`***************`

> 第三部分顯示變動前的檔案,即f1.

```*** 1,7 ****aa

a!aaa

a```

這時不僅顯示發生變化的第4行,還顯示第4行的前面三行和後面三行,因此一共顯示7行.所以,前面的` *** 1,7 **** `就表示,從第1行開始連續7行.

另外,檔案內容的每一行最前面,還有一個標記位.如果為空,表示該行無變化,如果是感嘆號(!),表示該行有改動,如果是減號(-),表示該行被刪除,如果是加號(+),表示該行為新增.

> 第四部分顯示變動後的檔案,即f2.

```- 1,7 --aa

a!baa

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 @@aa

a-a+ba

aa

> 第一部分,也是檔案的基本資訊.

```- 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行.

> 第三部分是變動的具體內容.

```aaa

-a+baa

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 @@aa

a-a+ba

aa

第一行表示結果為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 @@aa

a-a+ba

aa```

git diff 輸出結果分析

你也可以檢視我的其他同類文章,也會讓你有一定的收貨!代表原始檔 代表目標檔案 通常working area的檔案都是被當作目標檔案來看待。開頭的行,是隻出現在原始檔中的行 開頭的行,是隻出現在目標檔案中的行 空格開頭的行,是原始檔和目標檔案中都出現的行 差異按照差異小結進行組織,每個差異小結的第一行...

git diff 輸出結果分析

分享一下我老師大神的人工智慧教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!你也可以檢視我的其他同類文章,也會讓你有一定的收貨!代表原始檔 代表目標檔案 通常working area的檔案都是被當作目標檔案來看待。開頭的行,是隻出現在原始檔中的行 開頭的行,是隻出...

git diff命令詳解

git diff命令詳解 a 檢視尚未暫存的檔案更新了哪些部分,不加引數直接輸入 git diff 此命令比較的是工作目錄 working tree 和暫存區域快照 index 之間的差異 也就是修改之後還沒有暫存起來的變化內容。b 檢視已經暫存起來的檔案 staged 和上次提交時的快照之間 he...