为什么 Git Diff/Patch 信息与该补丁的 Git 集线器表示不同?
Why is the Git Diff/Patch info different than the Github representation of that patch?
当您查看文件的差异时,它会在顶部显示差异信息,然后突出显示下方的更改。
但是,在我看过的每个示例中...Github 突出显示的行号始终不同于 Git 在 [=] 中指定的行号52=] 信息。
例如 this commit(注意差异数据显示 @@ -362,7 +362,7 @@ def association_instance_set(name, association
,但 Github 在第 365 行开始突出显示。)
或者这个:
或者这样:
或者最后这个:
似乎 Github 突出显示的实际行号通常比 Git 指定的 patch/diff 数据高 3 行左右。
当我检查他们的 API 时,拉下我在上面突出显示并链接的第一个文件,将其吐出到一个数组中,然后使用 index
在数组中进行行计数,我得到也有不同的结果。
diff 指定更改的行,即 362
,使用我的数组转换方法输出到 364
而不是 365
,因为 Github 突出显示它。
有点不对劲。
这是为什么?
它是 "off by three" 因为 diff 格式包括实际有变化的行之前的三行。
所以 @@ -362,7 +362,7 @@
意味着更改发生在第 362 + 3 = 365 行,但代码的相关部分从第 362 行开始。
GitHub(以及一般的统一差异工具)提供了一些关于更改的上下文 - 上下三行(如果可用)。与输出一起打印的数字包括上下文行。因此,例如,给定一个由数字 1 到 100(每行一个)组成的文件,当与没有数字 42 的文件进行比较时,上下文显示从第 39 行开始的 7 行(或删除后的 6 行)甚至尽管唯一更改的行是第 42 行。
$ diff -u 100 99
--- 100 2016-07-31 09:31:25.000000000 -0400
+++ 99 2016-07-31 09:31:34.000000000 -0400
@@ -39,7 +39,6 @@
39
40
41
-42
43
44
45
这些补丁没有任何问题,它们看起来完全像它们应该的样子。
Unified diff 包括 3 行 context(默认情况下,这通常可以由 diff 提供商更改,如果 git diff
这是 -U<n>
或 --unified=<n>
).
让我们看看第一个示例中的 hunk:
@@ -362,7 +362,7 @@
它说 补丁文件 从第 362 行开始,diff 中包含 7 行。如果我们查看差异,我们可以看到它确实从第 362 行开始并且有 7 行长。
如果我们更详细地查看差异,我们会看到第 362、363、364 行是 逐字 生成的。第 365 行标有 -
(相应的 +
),因为它被删除并重新插入了另一行。这在输出中以 red/green 颜色突出显示。在实际差异文件中 而不是 的一件事是 GitHub 突出显示行的哪些部分已更改。那是 GitHub.
的自定义增强
然后,逐字显示未更改的下三个上下文行。
统一差异仅提供上下文行并将它们包含在差异中,GitHub 也以这种方式显示。
您更改了 1 行 (365),上下文前后三行。 patch/diff 文件中总共包含 7 行(从 362 开始)。
当您查看文件的差异时,它会在顶部显示差异信息,然后突出显示下方的更改。
但是,在我看过的每个示例中...Github 突出显示的行号始终不同于 Git 在 [=] 中指定的行号52=] 信息。
例如 this commit(注意差异数据显示 @@ -362,7 +362,7 @@ def association_instance_set(name, association
,但 Github 在第 365 行开始突出显示。)
或者这个:
或者这样:
或者最后这个:
似乎 Github 突出显示的实际行号通常比 Git 指定的 patch/diff 数据高 3 行左右。
当我检查他们的 API 时,拉下我在上面突出显示并链接的第一个文件,将其吐出到一个数组中,然后使用 index
在数组中进行行计数,我得到也有不同的结果。
diff 指定更改的行,即 362
,使用我的数组转换方法输出到 364
而不是 365
,因为 Github 突出显示它。
有点不对劲。
这是为什么?
它是 "off by three" 因为 diff 格式包括实际有变化的行之前的三行。
所以 @@ -362,7 +362,7 @@
意味着更改发生在第 362 + 3 = 365 行,但代码的相关部分从第 362 行开始。
GitHub(以及一般的统一差异工具)提供了一些关于更改的上下文 - 上下三行(如果可用)。与输出一起打印的数字包括上下文行。因此,例如,给定一个由数字 1 到 100(每行一个)组成的文件,当与没有数字 42 的文件进行比较时,上下文显示从第 39 行开始的 7 行(或删除后的 6 行)甚至尽管唯一更改的行是第 42 行。
$ diff -u 100 99
--- 100 2016-07-31 09:31:25.000000000 -0400
+++ 99 2016-07-31 09:31:34.000000000 -0400
@@ -39,7 +39,6 @@
39
40
41
-42
43
44
45
这些补丁没有任何问题,它们看起来完全像它们应该的样子。
Unified diff 包括 3 行 context(默认情况下,这通常可以由 diff 提供商更改,如果 git diff
这是 -U<n>
或 --unified=<n>
).
让我们看看第一个示例中的 hunk:
@@ -362,7 +362,7 @@
它说 补丁文件 从第 362 行开始,diff 中包含 7 行。如果我们查看差异,我们可以看到它确实从第 362 行开始并且有 7 行长。
如果我们更详细地查看差异,我们会看到第 362、363、364 行是 逐字 生成的。第 365 行标有 -
(相应的 +
),因为它被删除并重新插入了另一行。这在输出中以 red/green 颜色突出显示。在实际差异文件中 而不是 的一件事是 GitHub 突出显示行的哪些部分已更改。那是 GitHub.
然后,逐字显示未更改的下三个上下文行。
统一差异仅提供上下文行并将它们包含在差异中,GitHub 也以这种方式显示。
您更改了 1 行 (365),上下文前后三行。 patch/diff 文件中总共包含 7 行(从 362 开始)。