我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

此版本的 GitHub Enterprise 已停止服务 2020-11-12. 即使针对重大安全问题,也不会发布补丁。 要获得更好的性能、改进的安全性和新功能,请升级到 GitHub Enterprise 的最新版本。 如需升级方面的帮助,请联系 GitHub Enterprise 支持

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

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

本文内容

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

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

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

但是,当您在 your GitHub Enterprise Server instance 上查看该提交时,却可以看到它,并且不会遇到任何问题:

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

有几种可能的解释:

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

本地仓库已过期

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

$ git fetch remote

这将安全地将信息从远程仓库复制到本地克隆,无需对已检出的文件进行任何更改。 您可以使用 git fetch upstream从已复刻的仓库获取信息,或使用 git fetch origin从仅克隆的仓库获取信息。

提示:更多信息请参阅 Pro Git 手册中的管理远程仓库和获取数据

包含提交的分支已被删除

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

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

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

他们运行:

$ git branch recover-B B
# 创建引用该提交的新本地分支
$ git push upstream B:recover-B
# 将本地分支 B 推送到新上游分支,创建对提交的新引用

现在,可以运行:

$ git fetch upstream recover-B
# 将提交提取到您的本地仓库。

避免强制推送

除非万不得已,否则应避免向仓库强制推送。 如果可以向仓库推送的人不止一个,这个原则尤为重要。

延伸阅读