“@@…@@”;svn diff或git diff mean中带有at符号的元线?

“@@…@@”;svn diff或git diff mean中带有at符号的元线?,git,svn,diff,Git,Svn,Diff,当我使用svn diff或git diff时,它会显示如下行: @@ -1,5 +1,9 @@ 它们是什么意思?这些描述了受差异影响的线条。在您的例子中,这意味着该大块影响从第1行开始的5行,从而导致从第1行开始的替换,该替换有9行长 请注意,这是统一diff格式使用的格式。“经典”diff格式使用不同的模型(但现在谁使用经典diff?)这些称为(c)hunk header并包含范围信息 它们周围有两个at标志@。它们的格式如下: @@ -l,s +l,s @@ 其中,l是起始行号,s是更改

当我使用
svn diff
git diff
时,它会显示如下行:

@@ -1,5 +1,9 @@

它们是什么意思?

这些描述了受差异影响的线条。在您的例子中,这意味着该大块影响从第1行开始的5行,从而导致从第1行开始的替换,该替换有9行长

请注意,这是统一diff格式使用的格式。“经典”diff格式使用不同的模型(但现在谁使用经典diff?)

这些称为(c)hunk header并包含范围信息

它们周围有两个at标志
@
。它们的格式如下:

@@ -l,s +l,s @@
其中,
l
是起始行号,
s
是更改(c)hunk对每个文件应用的行号。
-
表示原始文件,
+
表示新的(修改的)文件。请注意,它不仅显示受影响的行,还显示上下文行

-1,5
位于原始文件中(由
-
指示)。它显示第一行是起始行,5行受影响/上下文行

+1,9
位于新的(修改的)文件中(由
+
指示),第一行是起始行和9个受影响的/上下文行


更多详细信息请参见:

简单示例分析

格式与
diff-u
unified diff基本相同

例如:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$')
@-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行!新的帅哥只是:

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

  • 在旧文件中,我们有6行,从旧文件的第11行开始:

    11
    12
    13
    14
    15
    16
    
    func1() {
        1;
        2;
        3;
        4;
        5;
        6;
        7;
        8;
        9;
    }
    
  • 在新文件中,我们有4行,从新文件的第9行开始:

    11
    12
    13
    16
    
    请注意,行
    11
    是新文件的第9行,因为我们已经删除了前一个hunk上的2行:2和3

Hunk header

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

@@ -4,7 +4,6 @@ func1() {
这也可以通过普通
diff
-p
标志获得

示例:旧文件:

11
12
13
14
15
16
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
2

这个令人敬畏的特性通常会准确地告诉每个hunk属于哪个函数或类,这对于解释差异非常有用


选择页眉的算法是如何准确工作的,讨论内容如下:

Superset:这可能是对diff hunk的最好解释。我有一个@20,7+20,8@@UserDefinedStitcher,我想它可能告诉我,我的更改是在第20行,或者更确切地说,是从第6行开始的20行。(第6行表示UserDefinedStitcher。)但这将我带到第26行,但我的更改在第23行。因此,git似乎超出了3行。发生了什么事?@请给出一个最小的可复制示例。啊,我看到20是文件开头的绝对行号。第20行是显示的上下文开头的行,我的更改是我下面的3行n上下文,因此是第23行。呸!:)那么数字指的是hunk+上下文?即git打印的行是hunk(更改)行加上hunk(更改)前的3行和hunk(更改)后的3行行。因此,行的范围是从上下文的开始到上下文的结束,即从第一个更改行之前的3行到最后一个更改行之后的3行?@将让我进一步消除歧义。当您看到类似于
-1,5
+1,9
的内容时,它非常简单。
1
表示和中的起始行号
5
表示(原始文件中未更改的行数+删除的行数),而
9
表示(新文件中未更改的行数+添加的行数)。因此,您可以有一个类似于文件的东西,其中有5行是您开始使用的,而不使用它们,然后在新提交中添加4行,您的差异将如上所示。