跳至主要内容

提交存在于 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.

避免强制推送

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

进一步阅读