【问题标题】:What does "@@ -1 +1 @@" mean in Git's diff output?Git的差异输出中的“@@ -1 +1 @@”是什么意思?
【发布时间】:2012-06-08 14:06:42
【问题描述】:

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

git diff <commitId>..<commitId>

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

我不知道那告诉我什么。我在谷歌上搜索了一下,但没有任何结果。

【问题讨论】:

  • 你能描述一下什么文件会产生这样的标题吗?
  • @kworr 这是一个愚蠢的问题,任何统一格式的差异都有范围标题。
  • @YuvalAdam:实际上 diff 统一格式有更多的字段应该像 [-+], 那样填写,这里我们没有显示任何更改,但是这个更改触及文件的第一行.

标签: git diff


【解决方案1】:

简单示例分析

格式与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() { 在:

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

这也可以通过普通diff-p 标志获得。

示例:旧文件:

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

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

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

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

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

选择标头的算法如何准确工作在以下位置讨论:Where does the excerpt in the git diff hunk header come from?

【讨论】:

  • 啊,所以我会将@@ -1,6 +1,4 @@ 读作“从第 1 行开始,旧行数为 6,但新行数为 4”
  • @Cloud 是的 :-)
【解决方案2】:

这是一个统一的 diff hunk 标识符。这是 GNU Diffutils 的 documented

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

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

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

您可以使用--label=label 选项更改标题的内容;见见Alternate Names

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

@@ 从文件行号到文件行号 @@ 来自任一文件的行 来自任一文件的行...

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

如果一个块及其上下文包含两行或多行,则其行号类似于<i>start</i>,<i>count</i>。否则只显示其结束行号。一个空的大块被认为在大块之前的行结束。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢。帮了忙。当没有尾随逗号和 s 时,默认为 1。
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2016-01-31
    相关资源
    最近更新 更多