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

vie*_*one 58 svn git diff

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

@@ -1,5 +1,9 @@
Run Code Online (Sandbox Code Playgroud)

他们的意思是什么?

man*_*lds 59

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

它们被双重标志所包围@@.它们的格式如下:

@@ -l,s +l,s @@
Run Code Online (Sandbox Code Playgroud)

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

-1,5是在原文件(由指示-).它显示第一行是开始和5个受影响/上下文行

+1,9是在新的(经修饰)文件(由表示+),并再次第一行是开始和9受影响/上下文行.

更多细节:http://en.wikipedia.org/wiki/Diff#Unified_format

  • @让我进一步消除歧义。当你看到像“-1,5”和“+1,9”这样的东西时,这真的很简单。“1”表示两者的起始行号,“5”表示(未更改的行数+原始文件中删除的行数),“9”表示(未更改的行数+添加的行数)在新文件中)。因此,您可以拥有一个包含 5 行的文件,开始时不对它们执行任何操作,然后在新提交中添加 4 行,您的差异将如上所示。 (3认同)

Cir*_*四事件 19

简单的例子分析

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

例如:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$')
Run Code Online (Sandbox Code Playgroud)

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

@@ -1,6 +1,4 @@
 1
-2
-3
 4
 5
 6
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16
Run Code Online (Sandbox Code Playgroud)

@@ -1,6 +1,4 @@ 手段:

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

Hunk标头

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

@@ -4,7 +4,6 @@ func1() {
Run Code Online (Sandbox Code Playgroud)

这也可以通过-pplain 的旗帜获得diff.

示例:旧文件:

func1() {
    1;
    2;
    3;
    4;
    5;
    6;
    7;
    8;
    9;
}
Run Code Online (Sandbox Code Playgroud)

如果我们删除行6,diff会显示:

@@ -4,7 +4,6 @@ func1() {
     3;
     4;
     5;
-    6;
     7;
     8;
     9;
Run Code Online (Sandbox Code Playgroud)

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

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

选择标题的算法如何正常工作在下面讨论:git diff hunk标题中的摘录来自哪里?

  • 这可能是diff hunk的最佳解释. (2认同)

fge*_*fge 5

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

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