【问题标题】:What do the numbers on a Git Diff header mean? [duplicate]Git Diff 标头上的数字是什么意思? [复制]
【发布时间】:2011-06-28 15:07:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: diff


    【解决方案1】:

    这个header被称为set of change,或者hunk。每个块都以一行开头,其中包含(用@@ 括起来)文件中的行或行范围from,no-of-lines,在更改之前(使用-)和之后(使用+)进行更改。之后是文件中的行。删除以- 开头的行,添加以+ 开头的行。补丁修改的每一行前后都被3行上下文包围。

    添加如下所示:

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

    这意味着,在第 78 行(= 75 + 3 行上下文)之前的原始文件中添加两行。在所有更改之后,这些将是第 106 行(= 103 + 3 行上下文)到第 107 行。
    请注意 from 数字的差异(-75 与 +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 行上下文)。

    Credit goes to Markus Bertheau.

    【讨论】:

    • 简短回答:在您的情况下,14 是应用更改之前大块的行数,12 - 之后。
    • no-of-lines 的值可能不会立即显现出来。 'before' 值是 3 个引导上下文行、- 行数和 3 个尾随上下文行的总和,而 'after' 值是 3 个引导上下文行的总和,@987654334 的数量@ 行和 3 个尾随行。在某些情况下,还有额外的中间上下文行也添加到这些数字中。所以显示的总行数通常不是no-of-lines 值!
    • 第一个添加 2 行的示例中有一条红鲱鱼:@@ -75,6 +77,8 @@。 75 和 77 可能会让新手误以为这与添加 2 行有关。实际上,一个更简单的例子就是@@ -75,6 +75,8 @@。 +77 只有在更高的其他编辑增加了 2 行时才会出现。
    • @AndrejsCainikovs 第一个例子中的75/77差异有什么原因吗?
    • 因为这是一个很好的答案,我想指出一个微妙的错误,如果我可能如此迂腐的话。你说,“这意味着,在第 78 行(= 75 + 3 行上下文)之后的原始文件中添加两行。”,你应该说“在第 77 行之后”,因为第 75 行本身就是 3 行之一上下文,即第 75、76 和 77 行是上下文。所以实际上是在第 77 行 (=75+2) 之后添加新代码。所以新文本“line1”将在第 78 行(如果这 2 个新行是唯一的更改/差异。)你明白我确定的点。
    【解决方案2】:

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

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

    格式与diff -u统一diff基本一致。

    我们从 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 行开始,共显示 6 行。因此它显示了第 1 到第 6 行。

      1
      2
      3
      4
      5
      6
      

      - 表示“旧”,因为我们通常将其调用为diff -u old new

    • +1,4 表示第二个文件的这一段从第 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。

    【讨论】:

    • 更清楚,谢谢。
    • 中肯,非常清楚。惊人的!这个答案实际上解释了格式,而不是参考输出的上下文使数字复杂化。
    【解决方案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]@@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多