带有svn diff或git diff标志的“@@ ... @@”元线是什么意思?

时间:2011-12-19 08:06:55

标签: git svn diff

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

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

他们是什么意思?

3 个答案:

答案 0 :(得分:57)

这些被称为(c)hunk标头并包含范围信息。

它们被符号@@的双重包围。它们的格式为:

@@ -l,s +l,s @@

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

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

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

此处有更多详情:http://en.wikipedia.org/wiki/Diff#Unified_format

答案 1 :(得分:17)

简单的示例分析

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

例如:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$')

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

@@ -1,6 +1,4 @@
 1
-2
-3
 4
 5
 6
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16

@@ -1,6 +1,4 @@表示:

  • -1,6:此作品对应第一个文件的第1行到第6行:

    1
    2
    3
    4
    5
    6
    

    -表示&#34; old&#34;,因为我们通常将其作为diff -u old new调用。

  • +1,4表示此部分对应于第二个文件的第1行到第4行。

    +表示&#34; new&#34;。

    我们只有4行代替6行,因为删除了2行!新的大块头只是:

    1
    4
    5
    6
    
第二个大块的

@@ -11,6 +9,4 @@类似:

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

    11
    12
    13
    14
    15
    16
    
  • 在新文件中,我们有4行,从新文件的第9行开始:

    11
    12
    13
    16
    

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

Hunk标题

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

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

这也可以通过普通-p的{​​{1}}标志获得。

示例:旧文件:

diff

如果我们删除行func1() { 1; 2; 3; 4; 5; 6; 7; 8; 9; } ,则差异显示:

6

请注意,这不是@@ -4,7 +4,6 @@ func1() { 3; 4; 5; - 6; 7; 8; 9; 的正确行:它跳过了行func11

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

如何精确选择标题的算法在Where does the excerpt in the git diff hunk header come from?

中讨论

答案 2 :(得分:5)

这些描述了受差异大块影响的线条。在你的情况下,这意味着大块从第1行开始影响5行,导致从第1行开始的替换为9行。

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