跳至主要内容

提交在 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 获取您已 fork 的仓库信息,或使用 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.

避免强制推送

除非绝对必要,否则请避免对仓库执行强制推送。多位人员能够向同一仓库推送时尤其如此。若有人对仓库进行强制推送,可能会覆盖其他人基于该提交进行的工作。强制推送会更改仓库历史,甚至可能导致 Pull Request 损坏。

延伸阅读

© . This site is unofficial and not affiliated with GitHub, Inc.