Tim*_*Tim 8 diff version-control text-processing
接下来是一个或多个差异;每个大块显示文件不同的一个区域。统一格式看起来像这样:
Run Code Online (Sandbox Code Playgroud)@@ from-file-line-numbers to-file-line-numbers @@ line-from-either-file line-from-either-file...
如果一个大块只包含一行,则只显示它的起始行号。 否则它的行号看起来像“开始,计数”。一个空的大块被认为是从大块后面的那一行开始。
如果一个大块和它的上下文包含两行或更多行,它的行号看起来像 'start,count'。否则只显示其结束行号。一个空的大块被认为在大块之前的行结束。
他们的意思是什么?您能否还举一些例子来说明它们的含义?
特别是,我无法分辨最后两段中案例之间的差异。他们似乎在谈论相同的案例,但我怀疑他们没有。
第一段中的“if”情况和第二段中的“otherwise”情况有什么区别?
第一段中的“otherwise”情况与第二段中的“if”情况有什么区别?
Ste*_*itt 19
我怀疑第一段(你突出显示的两段)试图解释from-file-line-numbers
而第二段试图解释to-file-line-numbers
。
我将忽略晦涩的文本,并解释 GNU 如何diff
实现统一diff
s(解决您的问题的标题)。
diff -u <(printf "a\nb\nc\n") <(printf "a\n")
Run Code Online (Sandbox Code Playgroud)
产生以下内容:
--- /proc/self/fd/11 2018-11-08 11:16:09.183611033 +0100
+++ /proc/self/fd/12 2018-11-08 11:16:09.184611029 +0100
@@ -1,3 +1 @@
a
-b
-c
Run Code Online (Sandbox Code Playgroud)
(我将省略后续示例中的前两行,因为它们不需要太多解释。)
这表明我们的两个“文件”不同,只有一组差异(“大块”)。在统一补丁中,每个文件比较都由一对以---
(“from”文件)和+++
(“to”文件)开头的行引入。在每个文件比较中,每个大块都以一行开头和结尾@@
。此行标识了 from 和 to 文件中更改的位置。from 位置以-
(它不是后面数字的一部分)开头,to 位置以+
. 位置是一对数字:起始行和长度(如果为 1,则省略)。因此,在上面的补丁中,我们进行了更改,将 from 文件中从第 1 行开始的三行转换为 to 文件中从第 1 行开始的单行。
帅哥可以包括上下文,这是上面的情况。默认情况下,diff
包括三行上下文(如果可用);它还将合并上下文重叠的大块头。如果更改前后没有三行上下文,则减少上下文;因此,上面我们只有一行更改之前的上下文,之后没有。此上下文被视为大块中给出的更改的一部分,因此它有助于起始行和长度。
diff -u0 <(printf "a\nb\nc\n") <(printf "a\n")
Run Code Online (Sandbox Code Playgroud)
说明了这一点:
@@ -2,2 +1,0 @@
-b
-c
Run Code Online (Sandbox Code Playgroud)
这是相同的更改,但没有上下文:因此它被简化为将从第 2 行开始的两行转换为从第 1 行开始的任何行的更改。
最简单的位置对应于改变一行的补丁,没有上下文:
$ diff -u0 <(printf "a\nb\nc\n") <(printf "a\nb\nd\n")
@@ -3 +3 @@
-c
+d
Run Code Online (Sandbox Code Playgroud)
根据上下文,这将是
@@ -1,3 +1,3 @@
a
b
-c
+d
Run Code Online (Sandbox Code Playgroud)
(上下文的用处是允许补丁对与原始文件不完全匹配的“来自”文件保持有用。patch
将应用行号不完全匹配的“模糊”补丁,如果它在一个原位置的一定距离。)