为什么我可以在GitHub上看到提交但是无法在我的本地存储库中查看它?

时间:2017-04-16 21:11:18

标签: git github

我正在尝试对以下提交进行一些调查:

https://github.com/dolphin-emu/dolphin/commit/f28cd62519f071dce69efc0bee4b20a849ae3dea

(特别是我试图找出这个提交是否在"提交任何标签/分支的祖先链#34;)

当我使用此存储库时,我无法看到此提交。

>git show f28cd62519f071dce69efc0bee4b20a849ae3dea
fatal: bad object f28cd62519f071dce69efc0bee4b20a849ae3dea

我还尝试了this answer的一些内容,但仍然无法看到它。

>git fetch origin f28cd62519f071dce69efc0bee4b20a849ae3dea
error: no such remote ref f28cd62519f071dce69efc0bee4b20a849ae3dea

>git reset --hard f28cd62519f071dce69efc0bee4b20a849ae3dea
fatal: Could not parse object 'f28cd62519f071dce69efc0bee4b20a849ae3dea'.

这次提交发生了什么,为什么我可以在GitHub上看到它而不是在我的本地存储库中?有没有办法在当地检查?

1 个答案:

答案 0 :(得分:3)

您的问题基本上与Retrieve specific commit from a remote Git repository重复,VonC's answer至关重要。但我有点好奇所以我四处寻找并写下来。

出于好的和坏的各种原因,git fetch使用的Git传输协议通常不允许您指定原始哈希ID。 (基本限制是它是其他 Git,你通过运行你的 Git在互联网电话上调用的那个,它控制着名称到ID的映射,您可以看到。他们可能允许您使用原始哈希ID,如VonC's answer中所示,但这取决于他们并要求他们明确启用该功能。)

这在实践中意味着对git fetch某些特定提交,即使您知道其哈希ID,您也必须知道或发现提交的某些名称可达。如果这些都在您自己的Git存储库中,您可以通过运行:

来完成
git branch --contains <hash>

git tag --contains <hash>

查看哪些分支和/或标记名称“到达”提交,即,在运行像git log这样的图形行走命令时从这些分支或标记名称开始,最终您关注的提交将显示出来

当然,问题在于有提交。这就是具有该提交的其他 Git。所以你必须说服他们为你做这件事。您必须他们告诉您哪些名称将到达提交。或者......好吧,让我们暂时保存一下。

根据How to tell which branch a github commit was for?,GitHub现在显示的显示页面自动包含一个到达提交的名称,除非可以从默认分支访问提交。当我点击你的链接时,我看不到名字,这意味着它在默认分支上。但这与此相矛盾:

  

当我把这个存储库gitcloned时,我看不到这个提交。

所以我自己尝试克隆它,事实上,它也不在我的克隆中 - 这告诉我们实际上在默认分支上不是。如果是,它将在克隆中,因为克隆克隆所有暴露的分支和标签。

换句话说,当我们通过Web界面查看页面时,GitHub声称我们看到哪个分支包含提交是......好吧,也许不是谎言,但至少也是如此强。

那它在哪里?

现在我们可能希望推出Big Hammer:镜像克隆。镜像克隆是--bare克隆的一种形式,您根本不会获得工作树,但它也会修改fetch refspec,以便您获得每个引用,而不是只是分支和标签。 (这是一个非常大的存储库,所以我实际上只是将现有的克隆转换为了一个获取镜像。 1 )GitHub使用了一堆不寻常的引用,存储在refs/pull/和{{1}中名字空格。也许我们的承诺埋没在其中一个中。

将克隆转换为镜像并重新获取带来了更多提交 - 有6140个“拉取请求”名称空间项目和2557个“可审阅”项目 - 但提交refs/reviewable/仍然是 不在其中。事实上,它无处可寻。

这里有更多线索:它是另一个提交的恢复,d12cc39826791220987b6df2a91cbedaae4d8264,也可以通过GitHub的Web界面访问(点击它声称要恢复的提交)。 f28cd62519f071dce69efc0bee4b20a849ae3dea也是d12cc39...的直接父母;而f28cd62519f071dce69efc0bee4b20a849ae3dea也不会出现在镜像克隆中,但d12cc39...d12cc39... 5d1db5d717d22339b498c24d5a3206743dbe68f1master

所以,鉴于我们的克隆中有stable,但5d1db5d7...和后续版本d12cc39...都没有,看起来很可能就是这样:

  • 作者撰写了一份提交文件并提交审核。
  • 作者意识到提交是错误的,并添加了对审核的回复。
  • 然后,作者意识到改变某些东西,然后立即将其更改回来,有点毫无意义,撤回了评论。现在有 no 名称可以通过它来访问这两个提交。
  • 但是,GitHub已经决定允许对这两个提交进行Web访问,并且尚未撤销表示对这两个不再克隆的Web访问(完全以任何方式)的提交。

最后,这意味着你无法将这两个提交到你自己的存储库中 - 但没有理由打扰;作者已经撤回了它们,因为恢复是因为它(可能)错误而从未添加过。

1 事实上,我作弊并使用f28cd62...来获取非裸露的手工伪造镜像。你不应该这样做;这通常不是一个好主意;这有点像通过投掷大量火花来检查电源是否打开。如果你不知道自己在做什么,你可能会惹火。 : - )