9

リモートリポジトリからプルするローカルリポジトリがあります。の説明から予想されるように、実行するgit pullだけでなく、git fetch; git merge FETCH_HEADまったく同じアクションを実行するために使用されます。git pull

説明

リモート リポジトリからの変更を現在のブランチに組み込みます。デフォルトモードでは、git pull は git fetch の略で、その後に git merge FETCH_HEAD が続きます。

現在、予想外に、実行中に参照が正しくgit fetch更新されなくなりました。現在、古いコミットに固執しています。実行すると、すべての変更がリモート追跡ブランチにダウンロードされますが、FETCH_HEAD が実行されるブランチに関係なく変更されません。FETCH_HEADFETCH_HEADgit fetch

# currently in branchone
> git fetch

# branchone is up to date since...
> git rev-parse branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# ...its in the same commit as the remote branch
> git rev-parse origin/branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# however FETCH_HEAD shows something different
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5

git pullそれでも正しいタスクを実行します。ただし、実行すると、間違ったコミットを指すため、git fetch; git merge FETCH_HEAD何かが異なります。FETCH_HEAD

動作を台無しにする可能性のある設定や問題はありますgit fetchか?

4

3 に答える 3

12

git fetchオプションなしで実行すると、リモート内のすべての参照が取得され、.git/FETCH_HEADファイルに書き込まれます。通常、ファイルの内容は次のようになります。

37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo
593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo

ディレクトリの下にこのような.gitファイルがある場合、そのファイルの最初のものが 40 文字の 16 進数、または既存のコミットに実際に一致する短い 16 進数である限り、それを参照として使用できます。

# This file can be used as a reference
> cat .git/MAGIC_HEAD
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef lorem ipsum
the rest does not really matter
refrigerator

# And thus it will be interpreted by many git commands like this
> git rev-parse MAGIC_HEAD
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef

git fetchこれを知っていると、参照を実行した後FETCH_HEAD、その最初の行にたまたまあるものに解決されることがわかります

# Assuming the already mentioned contents of .git/FETCH_HEAD
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5

のコンテンツの順序が.git/FETCH_HEAD、現在のブランチの参照を最初に含むことが保証されていないようです。

さまざまなリポジトリで試してみると、最初の行が常に現在のブランチであり、git fetch; git merge FETCH_HEAD期待どおりに機能するように見える場合があります。ただし、他のリポジトリでは、コンテンツの.git/FETCH_HEAD順序が異なり、多くの場合、最初の行が別のブランチのリモート コミットへの参照になるため、FETCH_HEAD参照が正しくなくなります。

なぜ違う振る舞いをするのかは、私にとって謎です。

解決策として、git fetch remote_name branch_nameを使用すると、この特定のブランチのみがフェッチされ、その 1 行のみが のコンテンツに表示され、.git/FETCH_HEAD参照FETCH_HEADが常に正しくなります。

# Will only fetch branchone
> git fetch origin branchone

# FETCH_HEAD will contain only a single line
> cat .git/FETCH_HEAD
593539e8a98ba5980d4b645db3b0f506bb9b6a2c branch 'branchOne' of github.com:user/repo
于 2012-10-31T23:45:58.240 に答える
0

完了した最新のコミット/プッシュを頭に向けるようにしてください。

GIT リポジトリでこれを使用します。

git reset --hard HEAD@{1}

これで問題が解決することを願って、これを以前と同じように完全に機能するようにします。

于 2012-07-16T11:36:46.037 に答える