素晴らしい記事を見つけた
こちらの記事がとてもわかりやすくローカルリポジトリがリモートについてまとめておられたので、これをみて自分の頭を整理するついでに"git pull origin master"は何をしているのかを理解するための要点をまとめて見る。
対象は、ローカルで使うgitコマンド(commit, branch, checkout, mergeなど)は使えているけど、 リモートリポジトリに対してのgitコマンド(pull, push, fetchなど)が不安という人だ。
git pull origin masterの正体
この記事のまとめはこうだ
git pull origin master は git fetch +git merge origin/master の合体コマンドである
ではgit fetch と git merge origin/masterは何をしているのか
一つずつ見ていこう
git fetch とは
git fetchはリモートリポジトリとローカルリポジトリの同期をするコマンドだ。
ローカルリポジトリがリモートリポジトリの状態をどのように表しているのかが理解できると同期の仕方が詳しく理解できる。
これを理解するとローカルリポジトリとリモートリポジトリのやり取りの全体像が見えてくる。
ではローカルリポジトリはリモートリポジトリの状態をどのように表しているのか?
ローカルリポジトリでのリモートリポジトリの表され方
リモート追跡ブランチというものが存在する
リモート追跡ブランチとは、リモートリポジトリの「あるブランチの状態」をそのまま表しているブランチである
例えば、リモート追跡ブランチの一つであるorigin/masterブランチは、リモートリポジトリの「masterブランチの状態」をそのまま表すブランチということだ
また、リモート追跡ブランチはorigin/ブランチ名のように表される。
つまり、origin/developはリモートリポジトリのdevelopブランチの状態、origin/hogeはリモートリポジトリのhogeブランチの状態をそのまま表すブランチになる。
ただ、ここで問題なのが、追跡ブランチはリモートの状態は自動的に反映されるわけではないということだ
では、どのようにして追跡ブランチにリモートの状態を反映させればいいのだろうか?
git fetchは追跡ブランチにリモートの状態を反映させるコマンド!
git fetchというコマンドを実行すると、全ての追跡ブランチがアップデートされ、現在のリモートの状態が反映される。
つまり、git fetchを行うことで、追跡ブランチは現在のリモートリポジトリの状態を忠実に表すブランチになれるということだ。
git fetch まとめ
git fetchとは、リモートリポジトリの状態を、ローカルの追跡ブランチに反映させるためのコマンドである
git merge origin/masterとは
このコマンドを実行した時にいたブランチに、リモートリポジトリのmasterブランチの状態を表したorigin/masterブランチをマージするコマンドである(基本的にはマスターブランチで行うであろう)
もしリモートのdevelopブランチの状態を持ってきたいとなったらdevelopブランチに移ってgit merge origin/developを実行すればいい。そうするとリモートのdevelopブランチの状態を表したorigin/developブランチがマージできる。
まとめ
git pull origin masterとは、「ローカルリポジトリの状態を追跡ブランチであるorigin/masterとかにコピーしてきて(git fetch)、masterブランチの追跡ブランチ(origin/master)をローカルのmasterブランチにマージしてきて!」という意味のコマンドであった。
cf.) git pull origin developは「ローカルリポジトリの状態を追跡ブランチであるorigin/masterとかにコピーしてきて
(origin/〇〇のブランチに全てにコピーされるからmasterもdevelopもコピーされる)、developブランチの追跡ブランチ(origin/develop)をローカルのdevelopブランチにマージしてきて!」という意味