Git

pull は本当に fetch + merge なの?

More than 3 years have passed since last update.

Git の pull は fetch + merge と同じというのをよく目にしますが、自分の中では違う気がしていて混乱しているので整理してみます。

認識が誤っている点などがございましたら、ご指摘いただければ幸いです。


3種類のブランチ

この記事では Git の 3 種類のブランチを以下のように表現します。


  • リモートブランチ

  • トラッキングブランチ

  • ローカルブランチ


リモートブランチ

リモートのリポジトリで定義されているブランチのことを指します。


トラッキングブランチ

リモートブランチを追跡するローカルリポジトリで定義されているブランチを指します。


ローカルブランチ

ブランチを切ったり、コミットなどをしていく実際に作業をするローカルリポジトリで定義されているブランチを指します。

これらを図にすると以下のような感じです。

1.png


fetch + merge の挙動

git fetch はリモートブランチの内容を取得し、トラッキングブランチに反映します。

git fetch originを実施した場合は以下の図のようになります。

3.png

git merge でトラッキングブランチをローカルブランチに反映します。

git merge origin/masterを実施した場合は以下の図のようになります。

5.png

このように fetch + merge をすると、トラッキングブランチを経由してリモートブランチの内容をローカルブランチに反映させることができます。


pull の挙動

git pull はリモートブランチの内容を直接ローカルブランチに反映します。

git pull origin masterを実施した場合は以下の図のようになります。

7.png

前述した fetch + merge とは異なり、pull の場合はトラッキングブランチにはリモートブランチの内容が反映されていません。

ですので、pull は fetch + merge と同じであると表現するのは違う気がしています。


追記 (2014/11/28)

上記の調査で動作確認したのはgit pull origin <ブランチ名>だけだったのですが、git pull originだとトラッキングブランチにもリモートの内容が反映されます。

なので、git pull originは fetch + merge と同じ挙動であるという表現は誤っていないと思います。

このように自己解決しましたが、ログとして文章はこのまま残しておきます。