简短版本:是否可以使用'git fetch'从远程仓库获取在git日志中不可见的提交(HEAD提交的一部分/下)
更长的版本: 我有一个如下所示的回购(远程复制):
A - B - C - D(HEAD)
\
\-E
远程版本通过提交E,重置为提交C,然后进行提交D来达到此状态。
在本地,我有一个旧的克隆,看起来像这样的回购:
A - B - C(HEAD)
当我从远程仓库获取时,我只得到提交D,但我希望能够重置 - 在我的本地仓库中提交E。
答案 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>