Git Diff标题上的数字是什么意思?

每次我运行git diff时,对于我所做的每一个更改,我都会得到一些带有数字的标题,例如:

@@ -169,14 +167,12 @@ function Browser(window, document, body, XHR, $log) {..... 

我想知道这四个数字是什么意思? 我想-169意味着这个特定的代码行最初是在169行,但现在在167? 14和12是什么意思?

这个被称为改变的集合,或大块。 每个块都以一行包含在@@中的行开始,该行或行范围是文件之前(带有- )和之后(带有+ )的更改时的非行。 之后来自文件的行。 以-开头的行被删除,以+开始的行被添加。 每个由修补程序修改的行被前后三行上下文环绕。

另外看起来像这样:

 @@ -75,6 +103,8 @@ foo bar baz +line1 +line2 more context and more and still context 

这意味着,在第78行之后的原始文件(= 75 + 3行的上下文)中添加两行。 这些将是第106行(= 103 + 3行的上下文)到107之后全部改变。
注意数字的区别(-75 vs +103),这意味着这个文件在这个特定的块之前还有其他的变化,这就增加了28(103-75)行代码。

删除如下所示:

 @@ -75,7 +75,6 @@ foo bar baz -line1 more context and more and still context 

这意味着删除原始文件中的第78行(= 75 + 3行上下文)。 所有变化后,未改变的上下文将在第75至80行。
请注意, from这个块中的数字是相等的(-75和+75),这意味着或者在这个块之前没有变化,或者在以前的变化中添加和删除的行的数量是相同的。

最后,一个变化看起来像这样:

 @@ -70,7 +70,7 @@ foo bar baz -red +blue more context and more still context 

这意味着,在所有更改之前,在文件中更改第73行(= 70 + 3行上下文),其中包含红色到蓝色。 在所有改变之后,改变的行也是行73(= 70 + 3行的上下文)。

信贷去Markus Bertheau 。

我想知道这四个数字是什么意思?

我们来分析一个简单的例子

格式与diff -u统一差异基本相同。

我们从1到16的数字开始,删除2,3,14和15:

 diff -u <(seq 16) <(seq 16 | grep -Ev '^(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 diff会输出[0-3]上下文行[before / after] [first / last]变化

@@ – [ original file's number of first line displayed ],[ context lines + removed lines ] + [ changed file's number of first line displayed ],[ context lines + added lines ] @@