質問: ### 前提 ローカルブランチ: master ### git merge FETCH_HEAD git fetch 後、ローカルの master ブランチの HEAD と fetch 後の FETCH_HEAD とは差分があるにもかかわらず、git merge FETCH_HEAD しても git already up-to-date となります。 ``` $ git diff HEAD FETCH_HEAD ... 差分がずらずら ... $ git log HEAD..FETCH_HEAD ... 未マージのコミットが1件存在 ... ``` 上記のとおり、diff および log で差分が確認できております。 ### 結果てきにマージはできたが。 git merge origin/master とすれば、無事差分をマージすることはできました。 がしかし上記のとおり、FETCH_HEAD に対しても、 master 差分があるにもかかわらず、 `git merge FETCH_HEAD` ではAlreadyで `git merge origin/master` では、マージが無事行えたの違いについて、 いくら調べても、情報が見つけられずしっくりきていません。 何卒宜しくお願いします。
回答: 多分追跡ブランチに登録されていない為だと思います。 git fetchした後に、 `.git/FETCH_HEAD` というファイルの中身を見てみて下さい。 恐らく全て `not-for-merge` という表示になっていないでしょうか? ``` xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx not-for-merge branch 'master' of github.com:yyyyyyy/zzzzzzz ``` 試しに以下のコマンドで追跡ブランチを登録してみてください。 `git branch --set-upstream-to=origin/master ローカルブランチ名` ⇒ ローカルブランチ名はご質問の内容を見るとmasterでしょうか。 その後、もう一度 git fetchし、`.git/FETCH_HEAD` というファイルの中身を見てみて下さい。 そうすると、 not-for-mergeが外れている事が確認出来ると思います。 ``` xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx branch 'master' of github.com:yyyyyyy/zzzzzzz ``` その後に、git merge FETCH_HEADすれば、マージ出来ると思います。 簡単に説明すると、FETCH_HEADはこのファイルに書かれているコミットIDを参照していますが、 `not-for-merge` となっていると対象外となります。 しかし、上記のご質問に書かれている git merge origin/masterだと直接上記のコミットID xxxxxを指定してmergeしているのでマージ出来たのではないかと思います。 ※ ご質問内容からの推測なので、間違っていたらすみません。あと、alreadyになる原因としては ローカルブランチに何らかの変更が入っている場合もFETCH_HEAD指定ではマージ出来なかったと思います。どちらかが原因の可能性が高いと思いますので、ご確認してみてください。