概要
Gitを利用しているとorigin/main
やorigin/develop
を見る機会が多いと思います。
これらはoriginのついていないmain
やdevelop
と何が違うのか、初学者だけでなく日頃Gitを使っている人も意外と理解せずに使っている人が多いと思いますので今回まとめてみました。
リモート追跡ブランチとは?
origin/main
のようにorigin/が付いているブランチのことをリモート追跡ブランチと言います。
正確にはorigin/main
の前にremotes/が付いてremotes/origin/main
と表現されます。
リモート追跡ブランチは、リモートリポジトリの最新状態を保持しておき、ローカルの作業ブランチと簡単に比較・同期できるようにするための仕組みです。
(リモートブランチはGitHubなどをイメージすると思いますが、正確には作業しているローカルブランチ以外のブランチは全てリモートブランチになりえます。ただ殆どの場合はGitHubなどのネットーワーク上の中央リポジトリが対象になりますので今回はあまり気にしなくても良いです。)
概念と用語の整理
まずはざっくりとした概念と用語を整理します。
-
ローカルブランチ
自分のPCで作業するためのブランチです。
ローカルブランチはリモート追跡ブランチを追跡することができます。
イメージ図ではローカルリポジトリの左に位置しています。 -
上流ブランチ(upstream branch)
ローカルブランチが追跡しているリモート追跡ブランチを上流ブランチと言います。
イメージ図ではmasterとdevelopが追跡しているリモート追跡ブランチのorigin/masterとorigin/developが上流ブランチといいます。 -
リモート追跡ブランチ
リモートリポジトリの最新状態を、ローカルで記録・参照するためのブランチです。
リモートリポジトリをクローンする時やローカルリポジトリをプッシュする時に作成される。
またフェッチやプルをした時に状態が更新されます。
イメージ図ではローカルリポジトリの右に位置しています。 -
リモートブランチ
GitHubやGitLabなど「リモート(サーバ上)」に存在するブランチです。
イメージ図ではリモートリポジトリに位置しています。
リモート追跡ブランチがあることによるメリット
リモート追跡ブランチによる恩恵はいくつかありますが、今回は2点に絞って説明します。
ローカルとリモートの差分を比較できる
リモート追跡ブランチがあることでローカルとリモートのブランチを比較できます。
これにより、プッシュ/プルのタイミングを安全に立てられます。
git statusコマンドで(ローカルが進んでいる/リモートが進んでいる/どちらも進んでいる)を即時に判断できます。
ローカルがリモートより進んでいる場合(未pushコミットあり)
イメージ図
以下のようにgit statusを実行することによって、ローカルブランチ(main)がリモートのブランチ(origin/main)よりコミットが一つ進んでいることを教えてくれます。
さらにプッシュすることでコミット履歴を合わせることができる旨記載されています。
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
リモートがローカルより進んでいる場合(未pullコミットあり)
イメージ図
以下のようにgit statusを実行することによって、リモートのブランチ(origin/main)がローカルブランチ(main)よりコミットが一つ進んでいることを教えてくれます。
さらにプルすることでコミット履歴を合わせることができる旨記載されています。
$ git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
両ブランチのコミットが進んでいる場合(履歴が分岐している・pushもpullも必要)
イメージ図
以下のようにgit statusを実行することによって、リモートのブランチ(origin/main)とローカルブランチ(main)のコミットがそれぞれ一つ進んでいることを教えてくれます。
さらにプルすることでコミット履歴を合わせることができる旨記載されています。
リモートが先行している状態ではプッシュはできません。
$ git status
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" if you want to integrate the remote branch with yours)
nothing to commit, working tree clean
コマンドを省略できる
リモート追跡ブランチがあることで、プッシュやプルのコマンド省略して実行できます。
ローカルのブランチをリモートにプッシュする場合
git push origin main
上流ブランチがないローカルブランチの場合、git pushの後にリモートを表すorigin
とブッシュしたブランチ(今回の例ではmain
)を引数として指定します。
上流ブランチがある場合はこのorigin
とmain
の部分を省略できます。
git push
このような省略した形でも、カレントブランチ(あなたが作業しているブランチ)をそのカレントブランチの上流ブランチにプッシュするという指示になります。
リモートブランチをプルする場合
プルの場合もプッシュと同様です。
git pull origin main
上流ブランチがない場合はorigin
とmain
を引数として定義する必要がありますが
上流ブランチがある場合は以下のように省略形で実行が可能となります。
git pull
まとめ
リモート追跡ブランチは作業する中で少し見えにくいうえに、メリットもわかりずらいため少し理解に苦労するところです。この記事で少しでも理解のお役に立てたら幸いです。
分かりずらい箇所もあると思いますので、質問等ありましたら是非ともコメントしてください。