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
。
简短版本:是否可以使用 '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
。