git 获取 'lost' 次提交

git fetching 'lost' commits

简短版本:是否可以使用 'git fetch' 从远程仓库获取在 git 日志中不可见的提交(部分 of/under HEAD 提交)

更长的版本: 我有一个看起来像这样的回购(远程副本):

A - B - C - D(HEAD)
         \
          \-E

远程版本通过提交 E、重置为提交 C、然后提交 D 进入此状态。

在本地,我有一个该存储库的旧克隆,如下所示:

A - B - C(HEAD)

当我从远程仓库获取时,我只得到提交 D,但我希望能够重置 --hard 以在我的本地仓库中提交 E。

做一个 git fetch --all 你会得到所有的提交。

签出所需的提交并确认它。

git fetch --all --prune
git checkout <SHA_1>

先讲一些背景知识,这样我的意思就更清楚了: fetch 命令分为两部分,一部分在你这边(你 运行 git fetch),另一部分在你这边远程(远程通过 http://git://ssh:// 或其他一些协议获取传入请求并启动某些东西,通常是内部 git upload-pack 程序)。远程 运行s 的上传包步骤会生成一系列 offers "I have an object" 形式(通常是提交或注释标签)"with ID id of type type named name".

您可以通过 运行宁 git ls-remote 而不是 git fetch 查看遥控器将 提供 的内容。这仍然是 运行s upload-pack 但不是检索所提供的内容,它只是显示(列出)要约。

您在报价列表中看到的就是您能得到的。如果它没有出现在这里,您将无法获得它 — 或者至少无法通过 git fetch 获得。其他一些方法,包括 git archive,可能允许您通过他们的原始 SHA-1 访问提交,如果您知道的话。

使其可获取

根据您的描述,远程似乎打开了引用日志(是一个常规的非裸存储库)。提交 E 曾经在某个分支上(在 HEAD 上)但已被重置,因此只能通过 HEAD 和分支的两个引用日志访问它。

通常1 upload-pack 提供 HEAD 加上 refs 中的所有参考。在 refs 不是 ,因此 upload-pack 不提供它们。这意味着如果没有当前引用指向您的提交E,它将不会被提供。要提供它,请登录远程并创建一个指向提交 E 的 ref,然后它将提供。


1这有点可配置;参见 git-namespaces and the three hideRefs configuration items in git-config