122

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

git diff <commitId>..<commitId>

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

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

4

3 回答 3

86

简单的例子分析

格式与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表示第一个文件的这一段从第 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() {

@@ -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 标头中的摘录来自哪里?

于 2015-07-24T16:44:01.443 回答
74

这是一个统一的差异大块标识符。这由 GNU Diffutils记录。

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

---从文件从文件修改时间
+++到文件到文件修改时间

时间戳看起来像是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

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

  • +
    在第一个文件中添加了一行。
  • -
    从第一个文件中删除了一行。
于 2012-06-08T14:11:04.537 回答
6

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

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

于 2012-06-08T14:10:05.893 回答