QA@IT

git merge origin/masterについて

9220 PV

お世話になります。
gitについて質問があります。

(git checkout masterの状態で)
git pullは
git fetch
git merge origin/master
と同等である。
と参考書には書かれているのですが、

git fetchは、ローカルのブランチを最新のリモートブランチの状態に更新する。
git mergeは、ローカルのワーキングツリー(作業ブランチ?)をリモートのmasterとマージさせる。
ということだと認識しているのですが、
git fetchでローカルブランチとマスターブランチの内容は同じはずなので
git merge masterでもいいのではないでしょうか?
あえて、origin(サーバー)のmasterからマージしているのは何か意図的な理由があるのでしょうか?

よろしくお願いいたします。

回答

git fetchは、ローカルのブランチを最新のリモートブランチの状態に更新する。

これが誤りです。
git fetch は「リモートのブランチの内容を手元に取ってくる」、
すなわち、origin/masterのローカルキャッシュを最新にしています。
この時点ではmasterは更新されていません。
git merge してはじめて内容が同期されるのです。

編集 履歴 (1)

naruse さんの回答に加えて一点追記します。リモート追跡ブランチの概念が抜けているため疑問なのだと思います。

あえて、origin(サーバー)のmasterからマージしているのは何か意図的な理由があるのでしょうか?

git merge origin/master は origin サーバの master からマージしているのではなく、ローカルのリモート追跡ブランチ origin/master から merge しています。そして、ローカルのリモート追跡ブランチ origin/master をリモート origin の master ブランチと同期させるのが、fetch コマンドになります。

git pull origin master は fetch により、origin/master を更新し、origin/master からローカルの master ブランチへ merge するのをまとめて実行するというのが、「同等」という言葉の意味です。

リモート追跡ブランチについては、濱野さんの「入門Git」の説明がわかりやすいです。

他のリポジトリで歴史が作られる過程を追跡するだけが目的で、その上でローカルに歴史が作られることはありません。ローカルブランチは、チェックアウトしてその上にコミットすることで歴史が進められるけれど、リモート追跡ブランチを直接チェックアウトしてその上にコミットすることはできない、ということです。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。