为什么 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 开始)。