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

2023-11-27

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

git diff <commitId>..<commitId>

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

我不明白那在告诉我什么。我在谷歌上搜索了一下但没有结果。


简单例子分析

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

例如考虑:

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

where:

  • 第一个文件包含01, 02通过16
  • 第二个文件包含相同的内容,但有几行02, 03, 14 and 15 removed

差异输出:

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

@@ -1,6 +1,4 @@ means:

  • -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() {

这也可以通过以下方式获得-p平原的旗帜diff.

示例:旧文件:

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

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

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

请注意,这不是正确的行func1: 它跳过了几行1 and 2.

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

选择标头的算法如何准确工作将在以下位置讨论:git diff hunk 标头中的摘录来自哪里?

一行大块总结符号

这种情况非常罕见,但请考虑:

diff -U0 <(seq -w 16) <(seq -w 16 | sed 's/10/hack/')

where:

  • -U0: 使用 0 行上下文
  • 第二个文件替换10 with hack

这种情况下的差异输出是:

@@ -10 +10 @@
-10
+hack

因此我们知道,当发生一行更改时,符号会被汇总为仅显示一个数字,而不是显示m,n pair.

此行为记录在引用的文档中托德的回答:

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

单行块添加和删除看起来像这样,删除:

diff -U0  <(seq -w 16) <(seq -w 16 | grep -Ev '^(10)$')

output:

@@ -10 +9,0 @@
-10

添加:

$ diff -U0 <(seq -w 16 | grep -Ev '^(10)$') <(seq -w 16)

output:

@@ -9,0 +10 @@
+10

在 diff 3.8、Ubuntu 22.10 上测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 的 diff 输出中的“@@ -1 +1 @@”是什么意思? 的相关文章

随机推荐