为什么Git Diff / Patch信息与该补丁的Github表示不同?

时间:2016-07-31 13:24:47

标签: ruby git github diff

当您查看文件的差异时,它会在顶部显示差异信息,然后突出显示以下更改。

但是,在我看过的每一个例子中...... Github用变化突出显示的行号总是不同于Git在Diff / Patch信息中指定的行号。

例如this commit(注意差异数据显示@@ -362,7 +362,7 @@ def association_instance_set(name, association,但Github在第365行开始突出显示。)

Github-Diff-Highlight-1

或者这个:

enter image description here

或者这个:

enter image description here

或者最后这一个:

enter image description here

似乎Github突出显示的实际行号通常比Git指定的补丁/差异数据高约3行。

当我检查他们的API时,请下拉我在上面突出显示并链接的第一个文件,将其吐出到数组中然后使用index在数组中进行行计数,我得到的结果也不同。< / p>

diff指定更改的行,即362,使用我的数组转换方法发送到364,而不是365,因为Github突出显示它。

所以有点不对劲。

为什么?

3 个答案:

答案 0 :(得分:3)

这些补丁没有任何问题,它们看起来应该看起来如何。

统一差异包括 context 的3行(默认情况下,如果git diff -U<n>或{{1} }})。

让我们看看你的第一个例子中的 hunk

--unified=<n>

它表示补丁文件从第362行开始,并且差异中包含7行。如果我们看看差异,我们可以看到它确实从第362行开始并且是7行长。

如果我们更详细地看一下差异,我们会看到第362,363,364行是 verbatim 。第365行标有@@ -362,7 +362,7 @@(各自-),因为它已被删除,另一行重新插入。输出中的红色/绿色突出显示。在实际的差异文件中,的一件事是GitHubs突出显示该行的哪些部分已被更改。这是GitHub的自定义增强。

然后,逐字显示未更改的三个下一个上下文行。

统一差异只是提供上下文行并将它们包含在差异中,而GitHub也会以这种方式显示它。

您有1个更改的行(365),以及上下文之前和之后的3行。总共生成7行,包含在补丁/差异文件中(从362开始)。

答案 1 :(得分:2)

它是“关闭三”,因为diff格式包含实际有变化的行之前的三行。

所以@@ -362,7 +362,7 @@表示更改发生在第362 + 3 = 365行,但代码的相关部分从第362行开始。

答案 2 :(得分:2)

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