fetchコマンド
git fetchはリモートを追跡するブランチ(リモート追跡ブランチ)を最新化するためのコマンド。
# 例
git fetch <リモート名> <ブランチ名>
# originのmainブランチ
git fetch origin main
# origin のすべてのブランチ
git fetch origin
# origin のすべてのブランチ(ショートハンド)
git fetch
リモート追跡ブランチ?
fetchを理解するにはリモート追跡ブランチを理解する必要がある(英語ではリモートトラッキングブランチという)。
リモート追跡ブランチとは、リモーリポジトリにあるリモートブランチを追跡するローカルにあるブランチのこと。
注意する点としては、リモートのブランチではなくローカルのブランチであること。また、リモート追跡ブランチは自動的には最新化されず、fetchコマンドを使って最新化する必要がある。(追跡という名前から自動でやってくれそうだがやってくれない)
リモート追跡ブランチをコンソール上で確認するには以下のコマンドで確認できる。-aオプションを忘れずに。
remotes/~から始まるブランチ。
$ git branch -a
* develop
main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/main
例えば、git fetch origin mainをすると、origin/main に対してリモートリポジトリの状態が反映される。
mergeコマンド
リモート追跡ブランチ(remotes/origin/developなど)の状態を現在のブランチに取り込むコマンド。
fetchでリモートリポジトリ(GitHubなど)から最新情報を取ってきても最新化されるのはリモート追跡ブランチだけ。
ので、リモート追跡ブランチの状態を現在作業しているブランチへ落としてくる必要がある。
以下を想定してmergeの使い方を確認する。
リモートリポジトリにある、developブランチから伸びているfeatureAブランチをローカルに取り込みたい
# まずは、ブランチの状態と自分の場所を確認する。
$ git branch -a
develop
featureA
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/featureA
remotes/origin/main
# 次にリモーリポジトリにあるfeatureAをリモート追跡ブランチに反映させる
$ git fetch origin featureA
# リモート追跡ブランチを最新化できたらmergeする
$ git merge remotes/origin/featureA としてはいけない。
# まだmergeはダメ。mergeは現在のブランチに取り込みを行うという機能である。
# 冒頭でgit branch -a を実行したが、そのときはmainにいるのでfeatureAに移動する必要がある
$ git checkout featureA
# 再度、git branch で場所を確認
$ git branch
develop
* featureA
main
# merge実行
$ git merge remotes/origin/featureA
# 上記で実行したコマンドだけ抜き出し
$ git branch -a
$ git fetch origin featureA
$ git checkout featureA
$ git branch
$ git merge remotes/origin/featureA
# 初めからfeatureAにいる場合
# 最低以下だけでOK
$ git fetch origin featureA
$ git merge remotes/origin/featureA
ちなみにmergeの際は以下のように少し短くできる。
$ git merge origin/featureA
上記のようにリモート追跡ブランチはコミュニケーションのなかでも「remotes/origin/featureAの~」ではなく 「origin/featureAの~」と使われることが多いので、覚えておかないと何の話しているんだ( ^ω^)・・・となる。
まだ自分のローカルにfeatureAがなくてローカルに持ってきたい場合
その場合もfetchを利用する。
# ローカルの状況を確認
$ git branch -a
develop
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/main
# リモートのfeatureAブランチの情報をローカルに持ってくる
$ git fetch origin featureA
# 再度ローカルの状況を確認
$ git branch -a
develop
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/featureA
remotes/origin/main
# 現状だとリモート追跡ブランチにしか存在しない。ここで作業したいのでローカルでfeatureAブランチを切る。
$ git checkout featureA
# ローカルの状況を確認
$ git branch
develop
* main
featureA
以上のように、git checkout featureAで自動的にリモート追跡ブランチの状態のブランチを切ってくれる。
また、上記手順の冒頭で git fetch origin featureAとしているがgit fetch origin でもよい。
しかし、その場合はoriginにあるすべてのブランチを最新の状態に書き換えるので注意。
おまけ
以下はすべてリモートトラッキングブランチを指す可能性があることを留意する。
・追跡ブランチ
・リモートブランチ
・リモート追跡ブランチ
・remotes/origin/featureA
・/origin/featureA
・上流ブランチ
上流ブランチについて
リモート追跡ブランチは上流ブランチといわれることがある。
なぜか。それは追跡している状況を想像するとわかりやすい。
リモートブランチを追跡するリモート追跡ブランチがあり、リモート追跡ブランチを追跡しているブランチであるmainブランチやgit branch コマンドで作成したブランチがあるとする。
そのとき、mainブランチからみてリモート追跡ブランチが上流にあるため、リモート追跡ブランチは上流のブランチという。
(ちょっと疑問なのはリモート追跡ブランチから見てリモートブランチも上流ブランチといわれるのかな?)