1

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

更长的版本:我有一个如下所示的 repo(远程副本):

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

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

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

A - B - C(HEAD)

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

4

2 回答 2

1

先介绍一些背景知识,以便更清楚我在下面的意思:该fetch命令分为两部分,一部分在您的端(您运行git fetch),另一部分在远程(远程通过http://, git://,ssh://或其他协议获取传入请求并启动东西,通常是内部git upload-pack程序)。在遥控器上运行的上传包步骤提供了一系列形式为“我有一个对象”(通常是提交或带注释的标签)“ID id类型为name的类型”。

您可以通过运行git ls-remote而不是git fetch. 这仍然运行upload-pack,但不是检索提供的内容,它只是显示(列出)优惠。

无论您在优惠清单中看到什么,都是您可以得到的。如果它没有出现在这里,你就不能得到它——或者至少不能通过git fetch. 如果您知道其他一些方法,包括git archive,可能允许您通过其原始 SHA-1 访问提交。

使其可获取

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

通常1 个 upload-pack报价HEAD加上refs. Reflogs不在refs所以upload-pack不提供。这意味着如果没有当前 ref 指向您的提交E,它将不会被提供。要提供它,请登录到远程并创建一个指向 commit 的 ref E,然后它会提供。


1这有点可配置;见git-namespaces和中的三个hideRefs配置项git-config

于 2016-04-26T20:27:17.323 回答
0

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

结帐所需的提交和它。

git fetch --all --prune
git checkout <SHA_1>
于 2016-04-26T19:49:36.037 回答