ちゃんと理解してる? git pull origin master の詳細!
git pull origin master の詳細!
はじめに
最近、何気なく使っていたgitコマンドで新たな発見があったのでその内容を記事にまとめようと思い、書いています。どうせ、git pull = git fetch + git merge
の説明で終わるんでしょと思っている人には、新たな学びがあると思うのでぜひこの記事を読んでみてください!
git pull について
まずは、git pullについて簡単に説明します。
多くの人は、git pullで「リモートリポジトリの最新の情報をローカルリポジトリに取り込む」という使い方をしていると思います。これは、業務上非常に多くやる作業なので、このgit pull自体の動きを意識している人は少ないのではないでしょうか?
そこで、今回はこのgit pullというコマンドについて深ぼっていきたいと思います。
git pull コマンドの引数について
git pullコマンドの引数は下記のようになっています。
# 引数ありバージョン
git pull [リポジトリ名] [ブランチ名]
この[リポジトリ名]でよく指定されるのが、origin(リモートリポジトリ)で[ブランチ名]で指定されるのが、masterです。これによって、今現在いるローカルのブランチに「リモートリポジトリのmasterブランチを取り込む」ことが可能になります。
続いて、git pullコマンドを引数なしで使ったらどのようになるのかについて説明します。
git pullコマンドを引数なしで使うと上流ブランチを取り込むようになります。
# 引数なしバージョン
git pull [上流ブランチ]
上流ブランチって何?
この上流ブランチというのは、あるローカルブランチがどのリモートブランチを追跡しているかを示したものです。
基本的には、ローカルのブランチ名と同じリモートのブランチを追跡していることが多いです。
つまり、ローカルのmasterはリモートのmasterブランチを追跡している。
あるローカルブランチの上流ブランチを確認する方法と設定する方法は以下のようになっています。
# 上流ブランチの確認方法
git branch -vv
## 上流ブランチの設定方法(今いるローカルブランチから)
git branch -u [リモートブランチ名]
ローカルブランチとリモートブランチで別名のブランチを追跡ブランチに置きたい時などは、一度-uオプションを設定しておき、git pull の引数なしで使えるようにしておくと便利かもしれません。
また、.git/config
にどのローカルブランチがそのリモートブランチを追跡しているかは記述されているので確認して見るのもいいかもしれません。
git pull = git fetch + git merge
続いて、git pullがgit fetch とgit mergeの合わせ技であることを説明します。
git fetchとgit mergeをそれぞれ詳しく説明することでより理解が深まると思うので、一つ一つ説明していきます。
git fetch について
このgit fetch
コマンドは、リモートブランチから最新の情報を取ってきて、ローカルのリモート追跡ブランチ(origin/master)に取り込むという作業を行います。そのため、git fetch
を行っただけでは、ローカルブランチやworktreeには何も影響を及ぼしません。
リモート追跡ブランチって何?
ここでは、git fetch
コマンドを完璧に理解するためにリモート追跡ブランチについて解説します。
このリモート追跡ブランチとは、ローカルに存在するリモートブランチの情報を一旦、保存しておくような役割を持つ場所です。基本は、origin/ブランチ名で管理されています。
つまり、ローカルのmasterブランチのリモート追跡ブランチはorigin/masterです。
# リモート追跡ブランチの確認コマンド
git branch -r
git merge について
まず、git fetch [リポジトリ名] [ブランチ名]
でリモートリポジトリの、とあるブランチをリモート追跡ブランチに保存している状態だとします。先ほども少し説明しましたが、この状態だとまだローカルリポジトリには何も反映されていません(正確にはローカルのリモート追跡ブランチには反映されている)。これを、ローカルブランチに反映させるコマンドがgit merge
コマンドです。
このコマンドを正確に説明するなら、「直前に fetch されたリモート追跡ブランチのうち、現在チェックアウトしているブランチの上流ブランチとなるリモートブランチの更新履歴があれば、マージを試みる」というコマンドです。
引数ありで使うなら、現在いるブランチに引数に指定したブランチを取り込むということをします。
git merge [ブランチ名]
上流ブランチとリモート追跡ブランチの違い
ここまでの説明で、上流ブランチとリモート追跡ブランチの違いがよくわからなくなっている人もいるかと思うので、説明します。
上流ブランチ
上流ブランチは、git pullの引数なしの時に参照されるもので、ブランチの向きを表しているようなものです。
リモート追跡ブランチ
リモート追跡ブランチは、ローカルリポジトリに存在していて、リモートリポジトリとローカルリポジトリの仲介役のようなものです。
このgit pull
というコマンドを本当の意味で理解するにはどちらも必要になる概念なのでしっかり理解しておきましょう!
Discussion