素晴らしい記事を見つけた
こちらの記事がとてもわかりやすくローカルリポジトリがリモートについてまとめておられたので、これをみて自分の頭を整理するついでに"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ブランチにマージしてきて!」という意味