在Git的diff输出中,“@@ -1 +1 @@”是什么意思?

我一直在收集从返回的信息中的数据

git diff <commitId>..<commitId> 

我碰到@@ -1 +1 @@

我无法弄清楚这是在告诉我什么。 我在Google上search了一下,但没有成功。

这是一个统一的差异标识符。 这由GNU Diffutilslogging。

统一的输出格式以双行标题开始,如下所示:

 --- from-file-file-modification-time
 +++ 到文件到文件修改时间

时间戳看起来像2002-02-21 23:30:39.942229878 -0800来指示date,小数秒的时间和时区。 在不支持小数时间戳的主机上省略小数秒。

您可以使用--label=label选项更改标题的内容; 请参阅请参阅备用名称 。

接下来是一个或多个区别的区别。 每个大块显示文件不同的一个区域。 统一格式的人像这样:

 @@ 从文件行号码到文件行号码 @@
  线从-无论是文件
  从任何一个文件 ...

如果一个大块只包含一行,则只显示其起始行号码。 否则,它的行号看起来像start , count 。 一个空的大块被认为是从大块后面的行开始。

如果一个块和它的上下文包含两行或多行,它的行号看起来像start , count 。 否则只会显示其结束行号码。 一个空白的大块被认为是结束在大块前面的行。

两个文件共同的行以空格字符开头。 两个文件之间实际上不同的行在左侧打印列中具有以下指示符字符之一:

  • +
    一行被添加到第一个文件。

  • 一行从第一个文件中删除。

简单的例子分析

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

例如:

 diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$') 

这里我们删除了第2,3,14和15行。输出:

 @@ -1,6 +1,4 @@ 01 -02 -03 04 05 06 @@ -11,6 +9,4 @@ 11 12 13 -14 -15 16 

@@ -1,6 +1,4 @@表示:

  • -1,6 :这个片段对应于第一个文件的第一行到第六行:

     01 02 03 04 05 06 

    -意思是“老”,因为我们通常把它作为diff -u old new

  • +1,4表示这段文件对应于第二个文件的第1行到第4行。

    +表示“新”。

    我们只有4行而不是6行,因为删除了2行! 新的大块只是:

     01 04 05 06 

第二个块的@@ -11,6 +9,4 @@是类似的:

  • 在旧文件中,我们有6行,从旧文件的第11行开始:

     11 12 13 14 15 16 
  • 在新文件中,我们有4行,从新文件的第9行开始:

     11 12 13 16 

    请注意,第11行是新文件的第9行,因为我们已经删除了前一个大块上的2行:2和3。

哈克头

根据你的git版本和configuration,你也可以在@@行旁边find代码行,例如func1() { in:

 @@ -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的正确行:它跳过了第1行和第2

这个令人敬畏的function通常精确地告诉每个大块属于哪个函数或类,这对解释diff是非常有用的。

如何select标题的algorithm是如何工作的:讨论: git diff hunk头文件的摘录来自哪里?

这是目前的大范围信息,说明这个差异大块开始和结束的行号。

阅读http://en.wikipedia.org/wiki/Diff#Unified_format进行深入的解释。