当我使用svn diff或git diff时,它显示如下行:
svn diff
git diff
@@ -1,5 +1,9 @@
这是什么意思?
1tuwyuhd1#
这些被称为(c)块头,包含范围信息。它们被符号@@处的双引号包围。它们的格式为:
@@
@@ -l,s +l,s @@
其中l是起始行号,s是每个相应文件的更改(c)块应用的行数。-表示原始文件,+表示新(修改)文件。请注意,它不仅显示受影响的行,还显示上下文行。-1,5在原始文件中(由-表示)。+1,9在新的(修改的)文件中(由+表示),第一行是开始行和9个受影响的/上下文行。更多详情:http://en.wikipedia.org/wiki/Diff#Unified_format
l
s
-
+
-1,5
+1,9
tkclm6bt2#
简单示例分析
格式基本上是相同的diff -u统一的差异。例如:
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,4 @@
-1,6
1 2 3 4 5 6
-的意思是“旧”,因为我们通常将其称为diff -u old new。
diff -u old new
+1,4
+表示“新”。我们只有4行而不是6行,因为删除了2行!新的大块只是:
1 4 5 6
@@ -11,6 +9,4 @@对于第二个块是类似的:
@@ -11,6 +9,4 @@
11 12 13 14 15 16
11 12 13 16
请注意,11行是新文件的第9行,因为我们已经删除了前一个块上的2行:2和3。
11
Hunk header
根据您的git版本和配置,您还可以在@@行旁边获得一个代码行,例如func1() {:
func1() {
@@ -4,7 +4,6 @@ func1() {
这也可以通过普通diff的-p标志来获得。示例:旧文件:
diff
-p
func1() { 1; 2; 3; 4; 5; 6; 7; 8; 9; }
如果我们删除行6,差异显示:
6
@@ -4,7 +4,6 @@ func1() { 3; 4; 5; - 6; 7; 8; 9;
请注意,这不是func1的正确行:它跳过了1和2行。这个令人敬畏的特性通常会准确地告诉每个块属于哪个函数或类,这对于解释差异非常有用。选择报头的算法如何准确地工作在以下讨论中:Where does the excerpt in the git diff hunk header come from?
func1
1
2
一行块汇总表示法
这是非常罕见的,但考虑:
diff -U0 <(seq -w 16) <(seq -w 16 | sed 's/10/hack/')
其中:
-U0
10
hack
这种情况下的diff输出是:
@@ -10 +10 @@ -10 +hack
因此,我们理解,当有一行变化时,符号被总结为只显示一个数字,而不是m,n对。此行为记录在Todd's answer引用的文档中:如果一个数据块只包含一行,则只显示其起始行号。否则,其行号看起来像start,count。一个空数据块被认为是从该数据块后面的行开始。和单行块添加和删除看起来像这样,删除:
m,n
diff -U0 <(seq -w 16) <(seq -w 16 | grep -Ev '^(10)$')
输出:
@@ -10 +9,0 @@ -10
添加:
$ diff -U0 <(seq -w 16 | grep -Ev '^(10)$') <(seq -w 16)
@@ -9,0 +10 @@ +10
在diff 3.8,Ubuntu 22.10上测试。
ylamdve63#
这些描述了受diff hunk影响的行。在您的例子中,这意味着hunk影响从第1行开始的5行,导致从第1行开始的替换,长度为9行。注意,这是统一的diff格式所使用的格式。“经典”diff格式使用不同的模型(但现在谁还用经典diff呢?)。
3条答案
按热度按时间1tuwyuhd1#
这些被称为(c)块头,包含范围信息。
它们被符号
@@
处的双引号包围。它们的格式为:其中
l
是起始行号,s
是每个相应文件的更改(c)块应用的行数。-
表示原始文件,+
表示新(修改)文件。请注意,它不仅显示受影响的行,还显示上下文行。-1,5
在原始文件中(由-
表示)。+1,9
在新的(修改的)文件中(由+
表示),第一行是开始行和9个受影响的/上下文行。更多详情:http://en.wikipedia.org/wiki/Diff#Unified_format
tkclm6bt2#
简单示例分析
格式基本上是相同的
diff -u
统一的差异。例如:
这里我们删除了第2、3、14和15行。输出:
@@ -1,6 +1,4 @@
表示:-1,6
意味着第一个文件的这一部分从第1行开始,总共显示了6行。因此,它显示了第1行到第6行。-
的意思是“旧”,因为我们通常将其称为diff -u old new
。+1,4
意味着第二个文件的这一部分从第1行开始,总共显示了4行。因此,它显示了第1行到第4行。+
表示“新”。我们只有4行而不是6行,因为删除了2行!新的大块只是:
@@ -11,6 +9,4 @@
对于第二个块是类似的:请注意,
11
行是新文件的第9行,因为我们已经删除了前一个块上的2行:2和3。Hunk header
根据您的git版本和配置,您还可以在
@@
行旁边获得一个代码行,例如func1() {
:这也可以通过普通
diff
的-p
标志来获得。示例:旧文件:
如果我们删除行
6
,差异显示:请注意,这不是
func1
的正确行:它跳过了1
和2
行。这个令人敬畏的特性通常会准确地告诉每个块属于哪个函数或类,这对于解释差异非常有用。
选择报头的算法如何准确地工作在以下讨论中:Where does the excerpt in the git diff hunk header come from?
一行块汇总表示法
这是非常罕见的,但考虑:
其中:
-U0
:使用0行上下文10
替换为hack
这种情况下的diff输出是:
因此,我们理解,当有一行变化时,符号被总结为只显示一个数字,而不是
m,n
对。此行为记录在Todd's answer引用的文档中:
如果一个数据块只包含一行,则只显示其起始行号。否则,其行号看起来像start,count。一个空数据块被认为是从该数据块后面的行开始。
和单行块添加和删除看起来像这样,删除:
输出:
添加:
输出:
在diff 3.8,Ubuntu 22.10上测试。
ylamdve63#
这些描述了受diff hunk影响的行。在您的例子中,这意味着hunk影响从第1行开始的5行,导致从第1行开始的替换,长度为9行。
注意,这是统一的diff格式所使用的格式。“经典”diff格式使用不同的模型(但现在谁还用经典diff呢?)。