简单例子分析
格式基本相同diff -u
统一差异
例如考虑:
diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')
where:
- 第一个文件包含
01
, 02
通过16
- 第二个文件包含相同的内容,但有几行
02
, 03
, 14
and 15
removed
差异输出:
@@ -1,6 +1,4 @@
01
-02
-03
04
05
06
@@ -11,6 +9,4 @@
11
12
13
-14
-15
16
@@ -1,6 +1,4 @@
means:
-
-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() {
in:
@@ -4,7 +4,6 @@ func1() {
这也可以通过以下方式获得-p
平原的旗帜diff
.
示例:旧文件:
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
and 2
.
这个很棒的功能通常可以准确地告诉每个块属于哪个函数或类,这对于解释差异非常有用。
选择标头的算法如何准确工作将在以下位置讨论:git diff hunk 标头中的摘录来自哪里?
一行大块总结符号
这种情况非常罕见,但请考虑:
diff -U0 <(seq -w 16) <(seq -w 16 | sed 's/10/hack/')
where:
-
-U0
: 使用 0 行上下文
- 第二个文件替换
10
with hack
这种情况下的差异输出是:
@@ -10 +10 @@
-10
+hack
因此我们知道,当发生一行更改时,符号会被汇总为仅显示一个数字,而不是显示m,n
pair.
此行为记录在引用的文档中托德的回答:
如果块仅包含一行,则仅显示其起始行号。否则它的行号看起来像start,count。空块被认为是从块后面的线开始。
单行块添加和删除看起来像这样,删除:
diff -U0 <(seq -w 16) <(seq -w 16 | grep -Ev '^(10)$')
output:
@@ -10 +9,0 @@
-10
添加:
$ diff -U0 <(seq -w 16 | grep -Ev '^(10)$') <(seq -w 16)
output:
@@ -9,0 +10 @@
+10
在 diff 3.8、Ubuntu 22.10 上测试。