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

Ruby 为什么Git Diff/Patch info与该补丁的Github表示不同?,ruby,git,github,diff,Ruby,Git,Github,Diff,当您查看文件的差异时,它将在顶部显示差异信息,然后突出显示下面的更改 但是,在我看过的每个示例中,Github在更改时突出显示的行号始终不同于Git在Diff/Patch信息中指定的行号 例如(请注意,差异数据显示@-362,7+362,7@@def association\u instance\u set(名称,association),但Github在第365行开始高亮显示。) 或者这个: 或者这个: 或者最后这个: 似乎Github突出显示的实际行号通常比Git指定的patch/d

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

但是,在我看过的每个示例中,Github在更改时突出显示的行号始终不同于Git在Diff/Patch信息中指定的行号

例如(请注意,差异数据显示
@-362,7+362,7@@def association\u instance\u set(名称,association
),但Github在第365行开始高亮显示。)

或者这个:

或者这个:

或者最后这个:

似乎Github突出显示的实际行号通常比Git指定的patch/diff数据高3行左右

当我检查他们的API时,下拉我在上面突出显示和链接的第一个文件,将其吐出到一个数组中,然后使用
索引对数组中的行进行计数,我也得到了不同的结果

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

所以有点不对劲

为什么会这样?

它是“关闭三行”,因为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行上下文(默认情况下,这通常可以由diff提供程序更改,如果是
git diff
,这是
-U
-Unified=

让我们看看第一个例子中的帅哥:

@-362,7+362,7@

它说补丁文件从第362行开始,diff中包含7行。如果我们查看diff,我们可以看到它确实从第362行开始,有7行长

如果我们更详细地查看差异,我们会看到第362、363、364行是逐字生成的。第365行标有
-
(相应的
+
)因为它被删除,另一行被重新插入。输出中的红色/绿色突出显示了这一点。实际的差异文件中没有的一点是GitHubs突出显示行的哪些部分被更改。这是GitHub的自定义增强

之后,将逐字显示接下来三行未更改的上下文

Unified diff只提供上下文行并将它们包含在diff中,GitHub也以这种方式展示了这一点


您更改了1行(365),前后各有3行作为上下文。总共有7行包含在修补程序/diff文件中(从362开始)。

您使用哪种语言使用
索引进行计数
?它是否使用基于零的索引(即,第365行有索引364)?Owen,这一点很好。我使用的是Ruby,它使用的是基于零的索引。因此,这可以解释我的实现和Github之间的
364
365
差异。但是,这仍然不能解释GH和Git之间的
+3
差异。
Git diff
有一个选项
-U
-unified=
定义上下文行。默认n为3。我不清楚您在这里真正想要的是什么。一些可能的问题是:“为什么要用diff来提供任何上下文”、“为什么在提供上下文时,要在更改行的两边各有3行”、“为什么首先要面向diff行”,“如何突出显示提供未更改上下文的差异中的实际更改“等等。我明白你想说什么,但为什么他们不显示该行之前的3行?即,从第
359行开始显示,并在第
362行中包含实际更改,就像你预期的和差异所说的那样?@marcamillion:by“他们”,您是指Github还是修补程序文件格式的作者?Github突出显示相关行(以及任何其他上下文)而不受diff输出的太多约束似乎是合理的。如果您谈论的是修补程序格式,那么可能有这样做的原因,也可能只是出于历史原因(我不确定)。@marcamillion第362行没有变化。Unified diff包含3行上下文。第一个变化是在365处。@PolyMone这正是我的观点。git的实际补丁数据,即
@-362,7+362,7@@def association\u instance\u set(name,association)
说变化从第362行开始,并发生在7行上(适用于加法和减法)@marcamillion您似乎只是误解了
@-362,7+362,7@
中的行号所说的内容。这并不意味着更改发生在第362行。这意味着补丁中显示的代码部分从第362行开始。正如其他人所指出的,这部分包括未更改的上下文。哦……好吧……这让人感到非常奇怪我感觉到了。所以,如果有两行被改变了,那大概是这样的:
@-362,8+362,8@
?@marcamillion是的。