1

短いバージョン: 'git fetch' を使用して、git ログ (HEAD コミットの一部/下) に表示されないリモート リポジトリからコミットを取得することは可能ですか?

より長いバージョン: 次のようなレポ (リモート コピー) があります。

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

リモート バージョンは、コミット E を作成し、コミット C にリセットしてからコミット D を作成することで、この状態になりました。

ローカルには、次のようなレポの古いクローンがあります。

A - B - C(HEAD)

リモートリポジトリからフェッチすると、コミット D しか取得できませんが、ローカルリポジトリで --hard をリセットして E をコミットできるようにしたいと考えています。

4

2 に答える 2

1

以下で何を意味するかをより明確にするために、最初にいくつかの背景を説明します。コマンドは2つfetchの部分で機能します。何か、通常は内部プログラム)。リモートで実行されるアップロード パック ステップは、「私はオブジェクトを持っています」(通常はコミットまたは注釈付きタグ) という形式の一連のオファーを作成しますgit fetchhttp://git://ssh://git upload-pack

の代わりに実行することで、リモートが提供するものを確認できます。これは引き続き実行されますが、提供されているものを取得する代わりに、オファーを表示 (リスト) するだけです。git ls-remotegit fetchupload-pack

ここのオファーリストに表示されているものは何でも入手できます. ここに表示されない場合は、取得できません。少なくとも、経由では取得できませんgit fetch。を含む他のいくつかの方法ではgit archive、未加工の SHA-1 を知っていれば、コミットにアクセスできる場合があります。

取得可能にする

あなたの説明を考えると、リモートのreflogsがオンになっているようです(通常の非裸のリポジトリです)。コミットはE以前はいくつかのブランチ (および at HEAD) にありましたが、リセットされて、 およびブランチの 2 つの reflog からのみアクセスできるようにHEADなりました。

通常、 1 つ upload-packのオファーHEADと 内のすべての参照refs。リログは入っていないrefsのでupload-pack提供していません。これは、コミットを指している現在の参照がない場合、Eそれは提供されないことを意味します。提供されるようにするには、リモートにログインし、 commit を指す ref を作成しますE


1これはある程度設定可能です。git-namespacesおよび の 3 つのhideRefs構成項目を参照してくださいgit-config

于 2016-04-26T20:27:17.323 に答える
0

agit fetch --allを実行すると、すべてのコミットが取得されます。

目的のコミットをチェックアウトし、それを確認します。

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