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