2012-07-13 32 views
7

私はリモートリポジトリからプルするローカルリポジトリを持っています。 description of git pullから期待されている通り、git pullだけでなく、まったく同じアクションを実行するために使用さgit fetch; git merge FETCH_HEADを実行:FETCH_HEADリファレンスが "git fetch"の後に正しく更新されない

説明

すると、現在のブランチにリモートリポジトリから変更を組み込みます。デフォルトモードでは、git pullはgit fetchに続いてgit merge FETCH_HEADを省略したものです。

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

# 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の動作に迷惑をかける可能性のある設定や問題はありますか?

答えて

7

オプションを指定しないでgit fetchを実行すると、リモコンのすべての参照がフェッチされ、.git/FETCH_HEADファイルに書き込まれます。あなたは.gitディレクトリの下に、このようなファイルを持っている場合は、あなたがいる限り、そのファイルの最初のものは40のいずれかであるように、参照として使用することができ

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

:ファイルの内容はusualy次のようになります文字16進数、または現行のコミットに実際に一致するより短い16進数。 .git/FETCH_HEADの内容の順序が保証されないように、我々はgit fetch参照FETCH_HEADを実行した後に解決されることを見ることができ、これを知っ

# 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 

は、その最初の行に

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

であることを起こるものは何でもあることに思えます現在のブランチの参照を最初に含むようにします。

異なるリポジトリで試してみると、最初の行は常に現在のブランチであると思われ、したがってgit fetch; git merge FETCH_HEADは期待どおりに機能するようです。しかし、他のリポジトリでは、.git/FETCH_HEADの内容が異なるように順序付けされ、最初の行は別のブランチのリモートコミットへの参照になることが多く、したがってFETCH_HEADの参照が正しくありません。

なぜそれが異なって振る舞うのかは、私にとって謎です。git fetch remote_name branch_nameが使用される場合、溶液として

は、これだけ特定のブランチは、単一のラインがFETCH_HEAD参照が常に正しい作り、.git/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 
0

最新のコミット/プッシュを指し示すようにしてください。

は、あなたのgitリポジトリ上でこれ​​を使用する:

これは、それが以前のように完璧に動作するために使用されるポイントにこれを取って、あなたの問題を解決することができます願って
git reset --hard [email protected]{1} 

+0

残念ながらありません。でも、リポジトリをresetingに非常に古いリビジョンはでは何も変わりません'git fetch'と' FETCH_HEAD'の動作。 – LopSae

+0

もう一つは、ローカルリポジトリ全体を削除して、もう一度クローンしてください。そうでなければ、あなたに何か間違っているかを調べようとしています。ローカルリポジトリ.. – aliasgar

+0

新しいリポジトリでは、動作は同じです。 'FETCH_HEAD'が指し示すコミットは、' .git/FETCH_HEAD'ファイルに最初に現れるコミットです。私はまだwhの疑いが残っている以前は 'git fetch; git merge FETCH_HEAD'はどのブランチでも完全に機能しました。 – LopSae

0

あなたは(引数なし)git fetchを実行した後、現在のローカルブランチ(すなわちHEAD)は、追跡ブランチの場合FETCH_HEADのみ(すなわちない-のためのマージとしてマークされていない)マージするための有効な参照が含まれますが。

ソリューションは、現在のブランチに追跡ブランチ(How do you make an existing Git branch track a remote branch?を参照)を作成または取得するために、リモートおよびブランチを指定することのいずれかである(すなわちgit fetch origin branch

+0

すべてのブランチがすでにリモートブランチを追跡しているところで作業していたブランチ。この質問にもう一度私の関心を寄せた後、なぜ私はFETCH_HEADリファレンスが正しく更新されないのかを説明するために私の答えを再表示しました。たぶんそれはあなたが言及したものと関連性があり、 '.git/FETCH_HEAD'の最初の行は、私が気付いていない他のいくつかの状況でのみ保証されます。 – LopSae

関連する問題