Git
GitHub

git fetchの理解からgit mergeとpullの役割

More than 3 years have passed since last update.

photo by yukop

gitを使い始めるとcommit, push, pullなどはある程度理解出来るようになりますが、fetchってなんだ?ってなりますよね。

あまり馴染みにくいのは、pullがfetchmergeの両方を組み合わせたコマンドだからなんですね。

pull = fetch + merge origin/master

fetchとは

gitの場合、リポジトリはリモートとローカルの2ヶ所あります。fetchとはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンドです。
fetchをしても、pullのようにファイルが更新されるわけではありません。
あくまでもローカルリポジトリが更新されるだけです。

もっと詳しくいうと、例えばmasterブランチを使っているのであれば、
origin/masterが更新されるということです。

masterとorigin/masterの違い

masterは、例えばローカルのファイルを更新してコミットする場合にはmasterに入りますよね。
ローカルの作業ディレクトリと結び付いているのがmasterブランチです。

origin/masterとはリポジトリと結びついているブランチです。
とはいってもorigin/masterを参照するといっても、常に直接リモート側を見ているわけではないのです。
git fetchをすることでorigin/masterが更新されるのですね。

ローカルリポジトリの中にはmasterとorigin/masterの2つそれぞれの情報が置かれていることになります。
fetchを行ったときに新しい更新があったとするとorigin/masterが最新になり、masterはその分の更新がまだ行われていない事になります。
そこでmergeが必要になるんですね。

master ← origin/master 最新情報をマージするわけですね。

git mergeへ

という理解を持てないと、svnなどを使ってきた人にはどこのブランチをマージするのか?となりますよね。
リモートリポジトリの最新情報をローカルのmasterブランチにマージする必要があります。

git merge origin/master

ここまで処理を行うことでローカルのファイルが最新状態に更新されます。

git pull

git pull は上記の工程を一気に行うコマンドでした。
便利なコマンドではありますが、これらの理解をした上で利用することでpullしたときにコンフリクトなどが発生してテンパらずに正しい理解で行動出来ますね。