-
Notifications
You must be signed in to change notification settings - Fork 24
difference between fetch and pull
git fetch
も最新の情報を取得してくるコマンドだと聞いたけど、git pull
と何が違うの?
git fetch
は リモートリポジトリから 手元にまだ無いデータを取得してくるために使います。しかし、あくまでも 取得してくる だけで、 その内容を自分の作業ブランチに 反映 はしません。
git fetch
した内容を作業ブランチに反映させるには git merge
コマンドを使います。
この、"変更を取得し作業ブランチに反映させる"という処理を一度に行うのが git pull
です。
git pull
に --rebase
オプションをつけると、"最新の状態に更新する" という結果だけ見ると git merge
と同じなのですが、そこまでの歴史の構成が違ってくるので、よちよち.rbとしては git pull --rebase
をする方針としています。
git fetch
は実際には
git fetch <リモートリポジトリ>
という構文になります。これは「<リモートリポジトリ>から更新情報を取ってくる」という命令になります。
たとえば、 リモートリポジトリである origin
リポジトリと ローカルリポジトリの差分を取得したいときには
git fetch origin
となります。
先ほど書いたとおり、あくまでも 取得してくる だけで、 その内容を自分のローカルリポジトリに 反映 はしません。
git merge
は実際には
git merge <リモートブランチ>
という構文になります。これは「今いる作業ブランチ(git branch
で確認できます)に <リモートブランチ> の内容を反映させる」という命令になります。
たとえば、リモートリポジトリである origin
リポジトリの master
ブランチ( origin/master
という表記になります)の内容を 今いる作業ブランチに反映させたいときには、
git merge origin/master
となります。
git pull
は実際には
git pull <リモートリポジトリ> <リモートブランチ>
という構文になります。
たとえば、リモートリポジトリである origin
リポジトリの master
ブランチから差分を取得して、今いる作業ブランチに反映させたいときには、
git pull origin master
となります。
つまり、git fetch origin
と git merge origin/master
を一度にできるのです。
create and checkout branch · yochiyochirb/meetups Wiki の "2. ブランチを最新の状態にする" で、「git branch <ブランチ名>
で新しいブランチを作る前に、ローカルリポジトリの状態を最新に更新してください」というお願いをしました。
これを git fetch
と git merge
で実現するとしたら、git checkout master
で master
ブランチに移動してから、
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)