Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

存在于 GitHub 上但不存在于本地克隆中的提交

有时,提交可以在 GitHub 上查看到,但不存在于仓库的本地克隆中。

使用 git show 在命令行上查看特定提交时,可能会收到灾难性错误。

例如,可能会在本地收到 bad object 错误:

$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592

但是,当你在 GitHub.com 上查看该提交时,却可以看到它,并且不会遇到任何问题:

github.com/$account/$repository/commit/1095ff3d0153115e75b7bca2c09e5136845b5592

有几种可能的解释:

  • 本地仓库已过期。
  • 包含提交的分支已被删除,因此该提交的引用不再有效。
  • 有人强制推送了提交。

本地仓库已过期

您的本地仓库可能还没有提交。 要将信息从远程存储库提取到本地克隆,请使用 git fetch

$ git fetch REMOTE

这可以安全地将信息从远程存储库复制到本地克隆,而无需对已签出的文件进行任何更改。可以使用 git fetch upstream 从创建分支的存储库中获取信息,或使用 git fetch origin 从仅克隆的存储库中获取信息。

提示:有关详细信息,请阅读 Pro Git 手册中的管理远程库并提取数据

包含提交的分支已被删除

如果存储库的协作者已删除包含提交的分支或者已强制推送该分支,则缺失的提交可能已为孤立状态(即无法从任何引用访问它),它也因此不会被提取到本地克隆中。

如果幸好有某个协作者的本地克隆存储库中包含了该缺失的提交,则他们可以将其推送回 GitHub。 他们需要确保通过本地分支引用该提交,然后将其作为新分支推送到 GitHub。

假设某人仍有包含该提交的本地分支(称为 B)。 这可能会跟踪已被强制推送或删除的分支,它们只是还没有更新。 要保留该提交,可以将该本地分支推送到 GitHub 上的新分支(称为 recover-B)。 在此例中,假设他们有一个名为 upstream 的远程库,通过该远程库他们可以获得对 github.com/$account/$repository 的推送访问权限。

他们运行:

$ git branch recover-B B
# Create a new local branch referencing the commit
$ git push upstream B:recover-B
# Push local B to new upstream branch, creating new reference to commit

现在,可以运行:

$ git fetch upstream recover-B
# Fetch commit into your local repository.

避免强制推送

除非万不得已,否则应避免向仓库强制推送。 如果可以向仓库推送的人不止一个,这个原则尤为重要。 如果有人强制推送到仓库,则强制推送可能会覆盖其他人基于其工作的承诺。 强制推送会更改存储库历史记录,并可能损坏拉取请求。

延伸阅读