Git的差异输出中“ @@ -1 +1 @@”是什么意思?


103

我一直在从以下来源返回的信息中收集数据

git diff <commitId>..<commitId>

我遇到了 @@ -1 +1 @@

我不知道那是什么告诉我。我在Google上搜索了一下,但无济于事。


您能描述在此标头中产生什么文件吗?
kworr 2012年

@kworr这是一个愚蠢的问题,任何统一格式的差异都具有范围标头。
Yuval Adam

@YuvalAdam:实际上,diff统一格式具有更多应填写的字段,例如[-+] <position>,<lines>,在这里我们没有显示任何更改,但这更改了文件的第一行。
kworr 2012年

Answers:


69

这是统一的diff块标识符。这是记录由GNU diffutils的。

统一输出格式以两行标题开头,如下所示:

--- from-file-from-file-modification-time 
+++ to-file-to-file-modification-time

时间戳看起来像是2002-02-21 23:30:39.942229878 -0800指示日期,带小数秒的时间和时区。在不支持小数时间戳记的主机上,小数秒被忽略。

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

接下来是一个或多个差异。每个块显示一个文件不同的区域。统一格式的块看起来像这样:

@@ from-file-line-numbers到file-line-numbers @@ line-
  from-
  两个文件line-from-两个文件 ...

如果块仅包含一行,则仅显示其起始行号。否则,其行号看起来像。空的块被视为从块后面的行开始。start,count

如果大块及其上下文包含两行或更多行,则其行号看起来像。否则,仅显示其结束行号。空的块体被认为在块体之前的行结束。start,count

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

  • +
    在第一个文件中添加了一行。
  • -
    从第一个文件中删除了一行。

68

简单实例分析

格式基本相同 diff -u统一的diff。

例如:

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表示第一个文件的这一部分从第1行开始,总共显示6行。因此,它显示第1至6行。

    1
    2
    3
    4
    5
    6
    

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

  • +1,4表示第二个文件的这一部分从第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版本和配置,您还可以在该行旁边获得一个代码@@行,例如func1() {in:

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

也可以使用-pplain标志获得diff

示例:旧文件:

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

如果我们删除line 6,则差异显示:

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

请注意,这不是正确的行func1:它跳过了行12

这个很棒的功能通常会准确告诉每个块属于哪个函数或类,这对于解释差异非常有用。

有关选择标头的算法的确切工作方式,请参见:git diff hunk标头中的摘录来自何处?


嗯,所以我会读@@ -1,6 +1,4 @@为“从第1行开始,旧行数为6,而新行数为4”
Cloud


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.