※ 【追記】もうだいぶ古い情報です。
Git の pull は fetch + merge と同じというのをよく目にしますが、自分の中では違う気がしていて混乱しているので整理してみます。
認識が誤っている点などがございましたら、ご指摘いただければ幸いです。
3種類のブランチ
この記事では Git の 3 種類のブランチを以下のように表現します。
- リモートブランチ
- トラッキングブランチ
- ローカルブランチ
リモートブランチ
リモートのリポジトリで定義されているブランチのことを指します。
トラッキングブランチ
リモートブランチを追跡するローカルリポジトリで定義されているブランチを指します。
ローカルブランチ
ブランチを切ったり、コミットなどをしていく実際に作業をするローカルリポジトリで定義されているブランチを指します。
これらを図にすると以下のような感じです。
fetch + merge の挙動
git fetch はリモートブランチの内容を取得し、トラッキングブランチに反映します。
git fetch origin
を実施した場合は以下の図のようになります。
git merge でトラッキングブランチをローカルブランチに反映します。
git merge origin/master
を実施した場合は以下の図のようになります。
このように fetch + merge をすると、トラッキングブランチを経由してリモートブランチの内容をローカルブランチに反映させることができます。
pull の挙動
git pull はリモートブランチの内容を直接ローカルブランチに反映します。
git pull origin master
を実施した場合は以下の図のようになります。
前述した fetch + merge とは異なり、pull の場合はトラッキングブランチにはリモートブランチの内容が反映されていません。
ですので、pull は fetch + merge と同じであると表現するのは違う気がしています。
追記 (2014/11/28)
上記の調査で動作確認したのはgit pull origin <ブランチ名>
だけだったのですが、git pull origin
だとトラッキングブランチにもリモートの内容が反映されます。
なので、git pull origin
は fetch + merge と同じ挙動であるという表現は誤っていないと思います。
このように自己解決しましたが、ログとして文章はこのまま残しておきます。
追記 (2019/11/13)
git version 2.12.0 では git pull origin master
でも origin/master が更新されているというコメントをいただきました。
現状は pull の挙動についてはこの記事の情報は参考になりませんが、3種類のブランチがあることの理解になれば幸いです。