Github 两个分支的比较视图有误?

55
当我在Github上进行比较视图,将master与另一个分支A进行比较时,Github似乎正在将A的HEAD版本与master的旧版本进行比较。
我查看了一下,从我的了解来看,似乎Github正在将分支Amaster的共同祖先进行比较。它实际上并没有将其与master的当前HEAD进行比较。 是否有一种方法可以在Github中将masterHEAD与分支AHEAD进行区分? 如果没有,为什么没有呢?这似乎是每个开发人员都想要做到的功能。或者是有一些步骤需要完成而我可能忽略了吗?我想能够直接从这些差异中创建拉取请求。 编辑:这里有一个显示问题的示例存储库。

https://github.com/bradparks/test_github_diff_view

  • 我创建了一个新的仓库,里面只包含一个文件README.md。
  • 我将这个文件设置为只有一行v100
  • 我从主分支(master)分出了一个名为A的新分支,并将这一行改为v200
  • 然后我在主分支中将值更改为“v300”,并使用比较链接比较了这两个分支。

    https://github.com/bradparks/test_github_diff_view/compare/A

    但我看到了以下意料之外的结果。为什么它没有与v300进行区别?而是v100?

    enter image description here


请您提供一个查询语句,指出您认为存在错误的比较部分。(顺便说一下,我没有看到dv) - Willem Van Onsem
@BradPranks: 我在谈论用于获取比较视图的 URL(一个带有查询参数的 URL,形式类似于:github.com/foo/bar?arg=val&oth=val2)。 - Willem Van Onsem
1
@CommuSoft - 感谢您的反馈 - 我已经添加了一个示例存储库来展示问题,并将其添加到上面的问题中。 - Brad Parks
1
GitHub 会与你上次从父分支合并的时间进行比较。如果你从未将主分支合并到你的分支中,那么它将是你创建该分支时的时间点。 - Powerlord
嗯...有趣...所以要将分支A合并到master,我首先要将master合并到分支A吗?我的分支A是一个功能分支。 - Brad Parks
3个回答

43
有没有一种方法在Github中将master的HEAD与Branch A的HEAD进行差异比较? 2018年9月:是的:GitHub现在明确支持“三点和两点Git diff比较”。请参见此处的示例keisuke在评论中提到了Bitbucket上的类似举措
2015年的原始答案:

如 "GitHub比较视图当前版本的分支" 中所述,GitHub仅支持三个点(...)范围快捷键规范。

此表单用于查看包含第二个和至其上的分支上的更改,从两者的共同祖先开始。

"git diff A...B" 等价于 "git diff $(git-merge-base A B) B"。 您可以省略其中任何一个,它与使用HEAD相同。

官方GitHub帮助 提到了此功能:

比较最常见用途是比较分支,例如在启动新的Pull Request时。

在这种情况下,PR分支从主分支开始(或应重新定位到主分支之上),这意味着主HEAD是主分支和PR分支之间的基础。

但是当这两个分支已经分叉时,比较的不再是 HEADs,而是一个共同的祖先和一个 HEADgit diff $(git-merge-base master B) B

注意:即使您直接指定了两个 SHA1,正如 "Comparing commits" 中明确记录的那样,仍然会执行 git diff $(git-merge-base A B) B
这不会直接对比两个提交。


1
@BradParks 请查看我的之前的回答 https://dev59.com/1IHba4cB1Zd3GeqPXemw#24978606 和 https://dev59.com/FGUq5IYBdhLWcg3wN94t#14681796。 - VonC
6
我尝试了这个方法,很有效。就像在实际合并之前必须解决所有合并冲突一样,至少在我看来是这样的;-) 但是,这难道不会使Github提供的“比较”视图几乎没有用处吗? 我知道他们在一定程度上受到git工作流程的限制,但对于99%的人来说,那个比较视图似乎非常具有误导性。我认为,如果该功能已经无法正常工作,最好干脆将其移除。 - Brad Parks
1
@BradParks 我已更新我的答案,解释了为什么leoger的答案行不通:你总是会与共同祖先进行差异比较,而不是另一个分支的HEAD。 - VonC
1
而且要百分之百地清楚,使这个工作的唯一方法是使用@VonC在此处详细说明的过程,其中包括在执行拉取请求之前对特性分支“A”进行变基。 - Brad Parks
1
GitHub最近实现了两点差异(two-dots-diff)功能:https://blog.github.com/changelog/2018-09-18-two-dot-comparison/,https://help.github.com/articles/about-comparing-branches-in-pull-requests/#three-dot-and-two-dot-git-diff-comparisons。顺便说一下,BitBucket的默认拉取请求是使用两点差异来比较的,这更加用户友好。请参阅:https://developer.atlassian.com/blog/2015/01/a-better-pull-request/。 - keisuke
显示剩余3条评论

1

另一个想法是,如果您想从您的工作和主分支头之间的差异创建拉取请求(按照o.p.的要求),那么您需要做的是首先将自己的分支与主分支重新定位 git rebase <master>,然后再创建拉取请求。

但通常情况下,您不需要这样做,Git非常聪明地进行合并,即使您不先重新定位,它也通常能够将您的工作添加到主分支中,就像您希望的那样添加。


1
在Github上,有没有一种方法可以将主分支(master)的HEAD与A分支(Branch A)的HEAD进行差异比较?

嘿...感谢反馈!我尝试了一下,但好像对我不起作用... # 标记后的所有内容都没有发送到服务器,我尝试将URL更改为许多不同的内容,但它们都给出了相同的结果。只有最后提交到主分支的提交,这使得它看起来有点可行。例如:https://github.com/bradparks/test_github_diff_view/commit/2c6f822f28#PART_HERE_NOT_USED-HASH_NOT_BEING_USED - Brad Parks
我有点困惑。如果您点击我提供的链接到您的test_github_diff_vew存储库,您没有看到您想要的差异吗?我看到的差异显示“-v100”和“+v300”。Github是否为同一URL向您和我展示了两个不同的页面? - leoger
当我以这种方式单击链接时,我确实看到了我想要的差异,一开始我认为这很棒。但后来我意识到它只是显示主分支上的最后一次提交。无论您在末尾放什么,它总是只显示该分支的最后一次提交。因此,这不是差异,而只是指向单个分支的单个提交的链接。例如,https://github.com/bradparks/test_github_diff_view/commit/master - Brad Parks
哦,你说得对!很抱歉我没有更仔细地验证我的答案。 - leoger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接