Skip to content

difference between fetch and pull

Yuka Kato edited this page Nov 30, 2015 · 3 revisions

Question

git fetch も最新の情報を取得してくるコマンドだと聞いたけど、git pull と何が違うの?

Answer

概要

git fetch は リモートリポジトリから 手元にまだ無いデータを取得してくるために使います。しかし、あくまでも 取得してくる だけで、 その内容を自分の作業ブランチに 反映 はしません。

git fetch した内容を作業ブランチに反映させるには git merge コマンドを使います。

この、"変更を取得し作業ブランチに反映させる"という処理を一度に行うのが git pull です。

git pull--rebase オプションをつけると、"最新の状態に更新する" という結果だけ見ると git merge と同じなのですが、そこまでの歴史の構成が違ってくるので、よちよち.rbとしては git pull --rebase をする方針としています。

もうちょっと細かく

git fetch について

git fetch は実際には

git fetch <リモートリポジトリ>

という構文になります。これは「<リモートリポジトリ>から更新情報を取ってくる」という命令になります。

たとえば、 リモートリポジトリである origin リポジトリと ローカルリポジトリの差分を取得したいときには

git fetch origin

となります。

先ほど書いたとおり、あくまでも 取得してくる だけで、 その内容を自分のローカルリポジトリに 反映 はしません。

git merge について

git merge は実際には

git merge <リモートブランチ>

という構文になります。これは「今いる作業ブランチ(git branch で確認できます)に <リモートブランチ> の内容を反映させる」という命令になります。

たとえば、リモートリポジトリである origin リポジトリの master ブランチ( origin/master という表記になります)の内容を 今いる作業ブランチに反映させたいときには、

git merge origin/master

となります。

git pull について

git pull は実際には

git pull <リモートリポジトリ> <リモートブランチ>

という構文になります。

たとえば、リモートリポジトリである origin リポジトリの master ブランチから差分を取得して、今いる作業ブランチに反映させたいときには、

git pull origin master

となります。

つまり、git fetch origingit merge origin/master を一度にできるのです。

よちよち.rbにおいてのオペレーション

create and checkout branch · yochiyochirb/meetups Wiki の "2. ブランチを最新の状態にする" で、「git branch <ブランチ名> で新しいブランチを作る前に、ローカルリポジトリの状態を最新に更新してください」というお願いをしました。

これを git fetchgit merge で実現するとしたら、git checkout mastermaster ブランチに移動してから、

git fetch origin

でリモートリポジトリとローカルリポジトリとの差分を取得し、

git merge origin/master

でその内容を反映させれば、結果として最新の状態にすることができます。

そして、この 2つを一度に実行したい場合は、ローカルの master ブランチで

git pull origin master

とすればいいということになります。

しかし、こちらの wiki に書いてある git pull コマンドには、 --rebase というオプションが指定されています。これがあると、結果としては最新の情報が反映されるのですが、 そこまでの歴史の構成 がまったく変わってくるのです。

rebase というのは ものすごく簡単に言うと 歴史を一本のまっすぐな線に保つ ためのコマンドです。よちよち.rb の方針としては、 git fetch git merge の組み合わせを使うのではなく、git pull --rebaseを使うことを選んでいる、というわけです。

どちらかが正しくてどちらかが間違っている、ということはありません(私はたいてい git pull --rebase していますが、fetch のほうがいいケースもあるようですし、fetch を推奨する人も当然いらっしゃいます)。

参考

wiki や他の説明で何度も紹介していますが、Pro Git のページが大変丁寧でわかりやすい(Git の仕組みから各操作を理解できる)ので、ぜひ一度ご覧になってみてください。

(以上の説明も、「Pro Git」と「入門git」をほぼそのまま書いただけみたいな感じです :x)

Git - ブランチとマージの基本

Git - リモートブランチ