はじめに
こんにちは、watnowの竹内です。GitHubユーザーの方なら必ず使ったことがあるといっていいほどよく使われるgit fetch
, git pull
コマンドですが、結構なんとなく使ってませんか?GitHub初心者の私はGitHubを使う度にこのコマンドを呪文のように唱えていますが、何やってるのかわからないまま呪文唱えるのって結構いやですよね…。そこで今回、この呪文で何をやっているのか初心者なりにまとめてみました。
基本的なコマンド
origin, origin/mainの違いってなに
git fetch
, git pull
の本格的な説明の前に必要な知識を学びます。
git fetch
を使ったことのある人は見たことありますよね?
git fetch origin
とかgit pull origin/develop
とかって使われ方をしているorigin
のことです。なんかどっちもブランチっぽい名前しとるけど俺作った記憶ねーよ!って毎回思ってました。
簡潔にいうと
origin
-> リモートリポジトリ
origin/main
-> origin
(リモートブランチ)のmain
を追跡するブランチ
のことを指します。
少しわかりにくいかもですが図で表すとこんな感じです
リモートブランチを追跡するブランチとはどういうことでしょうか?
リモート追跡ブランチ
図をみてもらうとわかりますが、リモート追跡ブランチはローカルリポジトリ内に存在するブランチの一種です。私たちは普段自分でやった作業を記録していくローカルブランチとみんなでやったことを統合していくリモートブランチを同期させていくことでチーム開発を可能にしています。この同期作業をなんかいい感じに手伝ってくれてるのがリモート追跡ブランチです。
この追跡ブランチが存在しなかった場合、リモートブランチの最新の状態の把握や差分の把握がかなりめんどくさくなります。
git fetch
とgit pull
ここまでやってしまえばgit fetch
とgit pull
の説明は簡単です。
2つともローカルに情報をもってくるコマンドだということは皆さん知っていると思いますが、この2つのコマンドの違いはなんでしょうか?
答えは「ローカルのどこまで情報を持ってきているのか」です。
図を見ればわかる通りgit fetch
はリモート追跡ブランチに情報をもってきているのに対してgit pull
はローカルブランチまで情報をもってきます。
チーム開発でよくあるケースを考える
他のメンバーのPRを手元で確認したいとき
-
git fetch
コマンドをつかうgit fetch origin git checkout origin/b
git fetch origin
でリモートの情報をリモート追跡ブランチにもってきます
その後git checkout origin/b
を実行することでリモート追跡ブランチにもってきた最新の情報をみることができます -
確認したいブランチがローカルにあるとき
git pull
コマンドをつかうgit checkout b git pull origin b
リモートにあるブランチで作業したいとき
git fetch origin
git checkout b
(補足)
checkout
を普段使っている人が、ここまでの解説を読むとこのコマンドでリモートにあるブランチをローカルにもってきて作業できることに違和感があるかもしれません。これまでの解説通りであればbブランチはまだローカルに存在していないためcheckoutできないのではないかという疑問がうまれます。fetch
を実行した段階では新しいブランチの情報はリモート追跡ブランチまでしか反映されていません。
ただしcheckout
を実行した段階でgit が以下の操作を行ってくれます。
- bブランチがローカルに存在しないことを察知し、ローカルにbブランチを生成
-
b
とorigin/b
を紐付け - ローカルのbブランチに移動
このようにしてローカルのbブランチで作業することができます!
さいごに
長い記事をここまで読んでくださりありがとうございました!
今回よく使われるgit fetch
git pull
を少しだけ深掘りしましたが、「とりあえずpull
しとこ」みたいな考えから少し抜け出せたような気がします。