codecamp

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

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

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

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

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

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

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
## 创建引用该提交的新本地分支
$ git push upstream B:recover-B
## 将本地分支 B 推送到新上游分支,创建对提交的新引用

现在,可以运行:

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

避免强制推送

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

延伸阅读

GitHub 提交视图之间的差异
GitHub 我的提交为什么链接到错误的用户?
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

GitHub 身份验证

在 GitHub 上管理订阅和通知

在 GitHub 上管理活动的订阅

GitHub 组织和团队

GitHub 管理对组织仓库的 Git 访问

GitHub 计费和付款

GitHub 使用议题和拉取请求进行协作

GitHub 在具有代码质量功能的仓库上进行协作

管理在 GitHub 上的工作

GitHub 建立强大的社区

GitHub 管理仓库

GitHub 自定义 GitHub 工作流程

在 GitHub Marketplace 中购买并安装应用程序

通过 GitHub Jobs 寻找人才

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }