git抓取'丢失'提交

时间:2016-04-26 19:40:56

标签: git git-fetch git-reflog

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

更长的版本: 我有一个如下所示的回购(远程复制):

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

远程版本通过提交E,重置为提交C,然后进行提交D来达到此状态。

在本地,我有一个旧的克隆,看起来像这样的回购:

A - B - C(HEAD)

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

2 个答案:

答案 0 :(得分:1)

首先考虑一些背景,以便我更清楚我的意思如下:fetch命令分为两部分,一部分在你的最后(你运行git fetch),一部分在遥控器上(遥控器得到了来自http://git://ssh://或其他协议的传入请求会激活某些内容,通常是内部git upload-pack程序。在远程服务器上运行的upload-pack步骤会生成一系列“我有一个对象”(通常是提交或带注释的标签)的商品“ID id 类型类型,名为 name “。

您可以通过运行git ls-remote代替git fetch来查看遥控器提供的内容。这仍然运行upload-pack但不是检索提供的内容,而是显示(列出)优惠。

无论您在优惠清单中看到什么,都可以获得。如果它没有显示在这里,你就无法得到它 - 或者至少不能通过git fetch得到它。其他一些方法(包括git archive)可能允许您通过原始SHA-1访问提交(如果您了解它们)。

使其可以获取

根据您的描述,听起来好像遥控器已打开reflog(是一个常规的非裸存储库)。提交E曾经在某个分支上(和HEAD)但已被重置,因此只能通过HEAD和分支的两个reflog访问它。

通常 1 upload-pack提供HEAD以及refs中的所有引用。 refs中的Reflog不是 ,因此upload-pack不提供它们。这意味着如果没有指向您的提交E的当前引用,则不会提供它。要获得它,请登录到远程并创建一个指向提交E的引用,然后它将会。

1 这有点可配置;请参阅git-namespaces中的git-config和三个hideRefs配置项。

答案 1 :(得分:0)

执行git fetch --all,您将获得所有提交。

结帐所需的提交及其。

git fetch --all --prune
git checkout <SHA_1>
相关问题