【古い情報です】 pull は本当に fetch + merge なの?


※ 【追記】もうだいぶ古い情報です。

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種類のブランチがあることの理解になれば幸いです。