2011-12-19 166 views

回答

52

這些被稱爲(c)hunk標題幷包含範圍信息。

它們被雙號標記@@包圍。它們的格式:

@@ -l,s +l,s @@ 

其中l是起始行號和s是變化的(c)中大塊適用於每個各自文件的行數。 -表示原始文件,+表示新的(修改)文件。請注意,它不僅顯示受影響的行,還顯示上下文行。

-1,5是在原始文件中(由-指示)。它顯示第一行是開始和5個受影響/上下文行

+1,9在新的(修改)文件中(由+指示),並且第一行是開始行和9個受影響/上下文行。

更多細節在這裏:http://en.wikipedia.org/wiki/Diff#Unified_format

+0

所以數字指的是大塊+上下文?即由git打印的行是大塊(改變)行加上前面3行和後面3行的大塊(改變)行。所以線的範圍是從上下文開始到上下文結束,即從第一個變化線之前的3個線到最後一個變化線之後的3個線? – Will 2017-08-24 16:11:28

5

這些描述了diff diff的影響。在你的情況下,這意味着大塊會影響從第1行開始的5行,從而導致從第1行開始的替換,這是9行長。

請注意,這是統一差異格式所使用的格式。 「古典」差異格式使用不同的模型(但是最近使用經典差異?)。

15

簡單的例子分析

格式基本相同diff -u統一差異。

例如:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$') 

在這裏,我們除去線2,3,14和15輸出:

@@ -1,6 +1,4 @@ 
1 
-2 
-3 
4 
5 
6 
@@ -11,6 +9,4 @@ 
11 
12 
13 
-14 
-15 
16 

@@ -1,6 +1,4 @@指:

  • -1,6:這一塊對應到第一檔的第一行到第六行:

    1 
    2 
    3 
    4 
    5 
    6 
    

    -意味着「舊」,因爲我們通常將其作爲diff -u old new

  • +1,4說這件作品對應於第二個文件的第1行到第4行。

    +表示「新」。

    我們只有4行而不是6,因爲2行被刪除!新的大塊就是:

    1 
    4 
    5 
    6 
    

@@ -11,6 +9,4 @@第二大塊是類似的:

  • 上的舊文件,我們有6條線路,起始於舊文件的第11行:

    11 
    12 
    13 
    14 
    15 
    16 
    
  • 在新文件中,我們有4條線,開始在新的文件的第9行:

    11 
    12 
    13 
    16 
    

    注意該行11是新文件的第9行,因爲我們已經刪除2行上一大塊:2和3

猛男頭

根據您的git版本和配置,您還可以在@@行旁邊獲得代碼行,例如的func1() {中:

@@ -4,7 +4,6 @@ func1() { 

這也可以用平紋diff-p標誌獲得。

舉例:舊文件:

func1() { 
    1; 
    2; 
    3; 
    4; 
    5; 
    6; 
    7; 
    8; 
    9; 
} 

如果我們刪除線6中,DIFF顯示:

@@ -4,7 +4,6 @@ func1() { 
    3; 
    4; 
    5; 
- 6; 
    7; 
    8; 
    9; 

請注意,這不是func1正確的路線:它跳過線12

這個令人敬畏的功能常常精確地告訴每個大塊屬於哪個函數或類,這對解釋diff是非常有用的。

如何選擇標題中的算法工作完全是在討論:Where does the excerpt in the git diff hunk header come from?

+1

這可能是區分大塊的最好解釋。 – mahonya 2015-09-04 14:12:03

+0

嗯,我有這個@@ -20,7 +20,8 @@ UserDefinedStitcher,我想也許它告訴我,我的修改是在第20行,或者說是從第6行開始的20行之後。(第6行是)。但是,這使我到了第26行,但是我的更改在第23行。所以看起來git已經超出了3行。到底是怎麼回事? – Will 2017-08-24 15:41:03

+0

@請生成一個最小可重現的例子。 – 2017-08-24 15:51:18