跳至主要内容

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.

避免强制推送

除非绝对必要,否则避免强制推送到存储库。如果有多个人可以推送到存储库,这一点尤其重要。如果有人强制推送到存储库,则强制推送可能会覆盖其他人基于其工作构建的提交。强制推送会更改存储库历史记录,并可能损坏拉取请求。

进一步阅读