Gitのリモートリポジトリをローカルに同期させる(反映させる)には、git pullコマンドを使う。 これはちょうどgit pushの逆の役割になり、コマンドもほぼ同じ構文となる。originは「git push」で説明したように、リモートリポジトリを表す。
git pull origin {ブランチ名}
git pullは内部的にgit fetchとgit mergeが実行されている。
git fetch
リモートリポジトリの情報をリモート追跡ブランチへダウンロード(同期)するコマンド。 リモート追跡ブランチは、その名の通りリモートリポジトリの情報を追跡しているブランチで、remotes/origin/masterのような名前で内部的に管理されている。 git fetchを実行すると、ローカルブランチを直接更新するのではなく、一端リモート追跡ブランチを更新する。
git merge
git fetchの後は、git mergeコマンドが実行される。これはリモート追跡ブランチにダウンロードしてきた情報を、ローカルブランチへ取り込む作業となる。 実際にはgit merge FETCH_HEADというコマンドが実行されており、このFETCH_HEADはgit fetchで取得したリモート追跡ブランチの最新情報を意味する。
git fetchとgit mergeを図に表すと以下のようになる。 git pullはfetchとmergeの2段階に分かれており、それらをまとめたコマンドである。 従って、git pullによるmergeに不安がある場合、個別にfetchとmergeを実施すればよい。
ちなみに個別にfetchとmergeをしたときのgit logの出力状態を確認してみる。fetch前はリモート追跡ブランチとmasterブランチが同じ状態にあるが、 fetch後はリモート追跡ブランチのみ更新されている。さらにmergeをすると、再度masterブランチがリモート追跡ブランチと同じ状態になっている。
git fetch前$ git log --oneline --all
80888c3 (HEAD -> master, origin/master, origin/HEAD) test4 <--masterとリモート追跡ブランチが同じ位置
69c90ef test3
d000b3a test2
5b89934 test1
git fetch後
$ git log --oneline --all
598c82e (origin/master, origin/HEAD) test5 <--リモート追跡ブランチだけ1つ進む
80888c3 (HEAD -> master) test4
69c90ef test3
d000b3a test2
5b89934 test1
git merge後
$ git log --oneline --all
598c82e (HEAD -> master, origin/master, origin/HEAD) test5 <--masterが再び追いつく
80888c3 test4
69c90ef test3
d000b3a test2
5b89934 test1