简单示例分析
格式与diff -u统一diff基本一致。
例如:
diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')
这里我们删除了第 2、3、14 和 15 行。输出:
@@ -1,6 +1,4 @@
01
-02
-03
04
05
06
@@ -11,6 +9,4 @@
11
12
13
-14
-15
16
@@ -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 行!新帅只是:
01
04
05
06
@@ -11,6 +9,4 @@ 对于第二个大块是类似的:
-
在旧文件上,我们有 6 行,从旧文件的第 11 行开始:
11
12
13
14
15
16
-
在新文件上,我们有 4 行,从新文件的第 9 行开始:
11
12
13
16
请注意,11 行是新文件的第 9 行,因为我们已经删除了前一个块上的 2 行:2 和 3。
大块头
根据您的 git 版本和配置,您还可以在 @@ 行旁边获取代码行,例如func1() { 在:
@@ -4,7 +4,6 @@ func1() {
这也可以通过普通diff 的-p 标志获得。
示例:旧文件:
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 的行。
这个很棒的功能通常可以准确地告诉每个块属于哪个函数或类,这对于解释差异非常有用。
选择标头的算法如何准确工作在以下位置讨论:Where does the excerpt in the git diff hunk header come from?