什么"@@ -1 +1 @@"在Git的diff输出中意味着什么?

SSE*_*ber 94 git diff

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

git diff <commitId>..<commitId>
Run Code Online (Sandbox Code Playgroud)

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

我无法弄清楚那是什么告诉我的.我在Google上搜索了一下,但无济于事.

Tod*_*obs 64

这是一个统一的差异标识符.这是记录由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 to-file-line-numbers @@
 line-from-either-file
 line-from-either-file...

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

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

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

  • +
    这里添加了一行到第一个文件.
  • -
    此处从第一个文件中删除了一行.


Cir*_*四事件 57

简单的例子分析

diff -u统一差异的格式基本相同.

例如:

diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')
Run Code Online (Sandbox Code Playgroud)

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

@@ -1,6 +1,4 @@
 01
-02
-03
 04
 05
 06
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16
Run Code Online (Sandbox Code Playgroud)

@@ -1,6 +1,4 @@ 手段:

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

Hunk标头

根据您的git版本和配置,您还可以在该行旁边获取代码@@行,例如func1() {:

@@ -4,7 +4,6 @@ func1() {
Run Code Online (Sandbox Code Playgroud)

这也可以通过-pplain 的旗帜获得diff.

示例:旧文件:

func1() {
    1;
    2;
    3;
    4;
    5;
    6;
    7;
    8;
    9;
}
Run Code Online (Sandbox Code Playgroud)

如果我们删除行6,diff会显示:

@@ -4,7 +4,6 @@ func1() {
     3;
     4;
     5;
-    6;
     7;
     8;
     9;
Run Code Online (Sandbox Code Playgroud)

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

这个很棒的功能通常可以准确地告诉每个hunk属于哪个函数或类,这对于解释diff非常有用.

选择标题的算法如何正常工作在下面讨论:git diff hunk标题中的摘录来自哪里?


Yuv*_*dam 6

这是当前的大块范围信息,说明此差异块开始和结束的行号.

请阅读http://en.wikipedia.org/wiki/Diff#Unified_format以获得深入的解释.