当我使用svn diff
或git 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
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 @@
手段:
-1,6
:此部分对应于第一个文件的第1行到第6行:
1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)
-
意思是"旧",因为我们通常称之为diff -u old new
.
+1,4
说这件作品对应第二档的第1到第4行.
+
意思是"新".
我们只有4行代替6行,因为删除了2行!新的大块头只是:
1
4
5
6
Run Code Online (Sandbox Code Playgroud)@@ -11,6 +9,4 @@
对于第二个大块是类似的:
在旧文件中,我们有6行,从旧文件的第11行开始:
11
12
13
14
15
16
Run Code Online (Sandbox Code Playgroud)在新文件中,我们有4行,从新文件的第9行开始:
11
12
13
16
Run Code Online (Sandbox Code Playgroud)
请注意,该行11
是新文件的第9行,因为我们已经删除了前一个块上的2行:2和3.
Hunk标头
根据您的git版本和配置,您还可以在该行旁边获取代码@@
行,例如func1() {
:
@@ -4,7 +4,6 @@ func1() {
Run Code Online (Sandbox Code Playgroud)
这也可以通过-p
plain 的旗帜获得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
:它跳过行1
和2
.
这个很棒的功能通常可以准确地告诉每个hunk属于哪个函数或类,这对于解释diff非常有用.
选择标题的算法如何正常工作在下面讨论:git diff hunk标题中的摘录来自哪里?
这些描述了受差异大块影响的线条.在你的情况下,这意味着大块从第1行开始影响5行,导致从第1行开始的替换,即9行长.
请注意,这是统一diff格式使用的格式."经典"diff格式使用不同的模型(但是现在谁使用经典差异?).