チーム開発で「同僚が今どんなブランチをpushしているか」「リモートに自分の知らないブランチが増えていないか」「originとupstreamでブランチの状態は違うのか」を確認したい場面は頻繁にあります。このときgit branch -rだけを覚えていると、実は見ているのはローカルに残った古いキャッシュだった、という落とし穴にはまりがちです。
この記事では、Gitのリモートブランチを確認するためのコマンドを、「ローカルが認識しているリモート状態」と「リモート自身が今持っている状態」の区別から整理して解説します。branch -r/branch -a/ls-remote/remote show/fetch --pruneの使い分け、追跡ブランチの仕組み、GUIでの確認方法、よくある勘違いまで体系的にまとめます。
この記事で学べること
- 「リモートブランチ」と「リモート追跡ブランチ」の違い
git branch -r・-a・-vvの使い分け- リモート直接問合せ(
git ls-remote)とキャッシュ確認の違い git remote showでリモート全体の状態を詳細に見る方法- 最新化する
git fetchと、削除済み参照を整理する--prune - リモートとローカルの進み遅れを比較する方法
- よくある勘違い(古い表示・追跡ブランチの削除・ls-remoteとbranch -rの違い)
まず押さえる:「リモートブランチ」と「リモート追跡ブランチ」は別物
Gitでは「リモートブランチ」という言葉が複数の意味で使われており、この区別を飛ばすと「git branch -rで見えているブランチが実は存在しない」といった混乱が起きます。
ポイント:git branch -rが表示するのはローカルに保存された「リモート追跡ブランチ」です。リモート本体の現在の状態ではなく、「前回fetchした時点」のスナップショットを見ています。最新を知りたいならgit fetchでスナップショットを更新するか、git ls-remoteでリモートに直接問い合わせる必要があります。
リモートブランチ確認コマンド早見表
用途に応じて適切なコマンドを選びましょう。「ローカルキャッシュを見るのか/リモートに直接問い合わせるのか」を意識すると迷いません。
git branch -r / -a で一覧を見る
もっとも基本的な確認コマンドです。-rはリモート追跡ブランチのみ、-aはローカル+リモート追跡を両方表示します。どちらもリモートへは通信しないことに注意してください。
# リモート追跡ブランチのみを表示 git branch -r # 出力例: # origin/HEAD -> origin/main # origin/develop # origin/feature/auth # origin/main # ローカル+リモート追跡を両方表示 git branch -a # 出力例: # * main ← 現在のローカルブランチ # feature/new-ui # remotes/origin/HEAD -> origin/main # remotes/origin/develop # remotes/origin/main
注意:git branch -rの表示は前回fetchしたときのスナップショットです。他メンバーがpushした新しいブランチや、削除したブランチは、git fetchするまで表示に反映されません。最新を見たいなら必ずgit fetch --pruneを先に実行してください。
git branch -vv で追跡ブランチと進み遅れを確認
-vvは各ローカルブランチがどのリモート追跡ブランチと連動しているか、そしてリモートと比べて何コミット進んでいる/遅れているかを一覧表示します。
git branch -vv # 出力例: # * main abc1234 [origin/main] Merge pull request #42 # feature/login def5678 [origin/feature/login: ahead 2] WIP: 認証API # legacy ghi9012 [origin/legacy: gone] 古い修正 # [origin/main] → 同期している # [origin/x: ahead 2] → ローカルが2コミット先行 # [origin/x: behind 1] → ローカルが1コミット遅れ # [origin/x: gone] → リモートから消えたブランチ
ポイント:goneと表示されているブランチはリモートが削除済みだがローカルに追跡情報だけ残っている状態です。作業が残っていなければgit branch -D <name>で整理できます。削除済み追跡の一括掃除は後述のgit fetch --pruneが便利です。
git remote show でリモートの詳細を見る
リモートに直接問い合わせて、HEAD・fetch/push URL・存在するブランチ一覧・ローカル設定との追跡関係までまとめて表示する強力なコマンドです。
git remote show origin # 出力例: # * remote origin # Fetch URL: git@github.com:user/repo.git # Push URL: git@github.com:user/repo.git # HEAD branch: main # Remote branches: # develop tracked # feature/new-ui tracked # main tracked # old-branch stale (use 'git remote prune' to remove) # Local branches configured for 'git pull': # develop merges with remote develop # main merges with remote main # Local refs configured for 'git push': # main pushes to main (up to date)
remote show で分かること
- リモートのHEAD(デフォルトブランチ)
- fetch URLとpush URLが一致しているか(fork運用で異なる場合がある)
- リモートに存在するブランチ一覧
stale表示:ローカル追跡が残っているがリモートにはもうないブランチ- 各ローカルブランチの
pull/push先設定
git ls-remote でリモートに直接問い合わせる
git ls-remoteはローカルに何も保存せず、リモートサーバーに直接問い合わせてブランチ・タグ一覧を取得します。「自分のローカルfetch状態に関係なく、今まさにリモートに何が存在するか」を知りたいときに使います。
# origin のすべての参照を表示 git ls-remote origin # ブランチだけに絞る git ls-remote --heads origin # 出力例: # a1b2c3d... refs/heads/develop # e4f5g6h... refs/heads/feature/auth # i7j8k9l... refs/heads/main # タグだけ git ls-remote --tags origin # 特定のブランチだけ確認(パターンマッチ) git ls-remote origin "refs/heads/feature/*" # URL直接指定(ローカルにcloneせず確認) git ls-remote https://github.com/user/repo.git
ポイント:ls-remoteはfetchと違ってローカルの追跡ブランチを更新しません。「見るだけ」の操作なので、CIやスクリプトでブランチ存在チェックに使うと副作用がなく安全です。逆に「ローカルで作業できるように準備する」ならfetchを使います。
git fetch でリモート追跡ブランチを最新化
git fetchはリモートの最新情報をダウンロードしてローカルのリモート追跡ブランチ(origin/*)を更新します。作業中のローカルブランチには影響を与えないため、安心して実行できます。
# 既定のリモートから最新化 git fetch # 登録されているすべてのリモートを一括で最新化 git fetch --all # 削除されたリモートブランチの追跡も同時に整理 git fetch --prune # すべてのリモートから fetch しつつ prune も行う(推奨) git fetch --all --prune # タグも含めて最新化 git fetch --tags
fetch と pull の違い
git fetchは「見るだけ」、git pullは「取り込んで現在のブランチに自動マージ」します。リモートの状況を確認するだけならfetchで十分で、ローカル作業中のブランチを意図せず変更されないため安全です。
# 確認だけ(ローカルブランチは変わらない) git fetch git log --oneline origin/main -5 # リモートmainの最新5件を確認 # 取り込んでマージまで自動で実行(ローカルブランチが更新される) git pull # 内部的には:git fetch + git merge FETCH_HEAD
リモートとローカルの差分を比較する
「今のローカルは、リモートより何コミット進んでいる?」「リモートにだけ入っているコミットは何?」を調べるには次のコマンドが便利です。比較の前に必ずgit fetchで最新化しておきましょう。
# リモートにだけ入っているコミット(自分が未取得のもの) git log --oneline HEAD..origin/main # ローカルにだけ入っているコミット(未pushのもの) git log --oneline origin/main..HEAD # 両方向の差分を一覧 git log --oneline --left-right HEAD...origin/main # ファイル差分 git diff origin/main..HEAD -- src/ # ahead/behindの件数だけ知りたい git rev-list --left-right --count origin/main...HEAD # 出力例: 3 2 ← リモートが3件先、ローカルが2件先
ブランチ同士の差分をもっと詳しく知りたい場合はブランチ間の差分を比較する方法も合わせてお読みください。
削除済みリモートブランチの追跡を掃除する(prune)
リモートでブランチが削除されても、ローカルの追跡情報は自動では消えません。git branch -rに存在しないはずのブランチが表示され続ける原因はこれです。定期的に--pruneで掃除しておくと表示がすっきりします。
# pruneを含めてfetch(推奨) git fetch --prune # pruneだけ実行(fetchしない) git remote prune origin # pruneした場合に何が消えるか事前確認(dry-run) git remote prune origin --dry-run # 全リモートに対して一括prune git fetch --all --prune
毎回pruneを自動実行する設定
毎回--pruneを付けるのが面倒なら、Git全体で常時pruneするよう設定できます。
git config --global fetch.prune true
「削除したはずのブランチが消えない」問題はリモートブランチを削除しても残ってしまうときの原因と解決方法で詳しく解説しています。
実践シナリオ:確認が必要になる典型ケース
シナリオ① 同僚がpushしたブランチをチェックアウトしたい
# 最新情報をfetch git fetch --all --prune # リモートにどんなブランチがあるか確認 git branch -r # 目的のブランチを取得して作業用に切り替え git switch feature/review-me # Git 2.23以降は「同名リモート追跡があれば自動でトラック」してくれる
シナリオ② 自分のpush漏れを確認する
git fetch origin # 全ブランチの未push状況を俯瞰 git branch -vv | grep ahead # 特定ブランチの未pushコミット内容 git log --oneline origin/feature/api..feature/api
シナリオ③ リモートにだけあるブランチを探す(ローカルにないもの)
# fetchで情報更新 git fetch --all --prune # ローカル+リモート一覧を眺める git branch -a # 差分を抽出する簡易スクリプト(bash) comm -23 \ <(git branch -r | sed "s|origin/||" | sort) \ <(git branch | tr -d " *" | sort)
シナリオ④ fork先のupstreamも合わせて確認
fork開発ではorigin(自分のfork)とupstream(本家)の2つを使い分けます。両方のブランチ状況を確認するには:
# 登録されているリモート一覧 git remote -v # 全リモートを最新化 git fetch --all --prune # リモート追跡ブランチを全部見る git branch -r # 出力例: # origin/main # origin/feature/xxx # upstream/main # upstream/develop # upstream の状態詳細 git remote show upstream
fork運用の詳細はoriginとupstreamの違いと使い分け完全ガイドに解説があります。
GUI・IDEでの確認方法
コマンドだけでなくGUIツールでも視覚的に確認できます。プロジェクト全体の分岐構造を把握したいときはGUIが向いています。
主要ツールでのリモートブランチ表示
- VS Code / Cursor:GitLensやSource Controlパネルで
REMOTESツリーを展開すると一覧可 - JetBrains(IntelliJ/WebStorm):Git ツールウィンドウ → Branches → Remote Branches
- SourceTree:左サイドバーのRemotesセクションで
originを展開 - GitHub Desktop:Current Branchドロップダウンに
origin/付きで表示 - gitk / git gui:
gitk --allで全ブランチ込みのグラフ表示
GUIもCLI同様、表示される内容は前回fetchしたときのスナップショットです。多くのツールは自動fetch機能を持っていますが、手動で実行した方が確実です。
よくある勘違いと落とし穴
git branch -r がリモートの「今」を表していると思い込む
表示されているのは前回fetchしたときのスナップショットです。他メンバーが新規pushしたブランチや、リモートで削除されたブランチは反映されていません。「最新を見ている」という前提で作業すると、存在しないブランチをチェックアウトしようとしてエラーになったり、逆にリモートにすでにある新機能ブランチに気付かなかったりします。確認前は必ずgit fetch --pruneを実行する習慣を付けましょう。
git branch -d origin/xxx でリモートブランチが消えると思う
旧記事にもよくある誤解ですが、git branch -d origin/xxxはローカルの追跡情報を消すだけで、リモート本体には影響しません。リモートブランチ自体を削除したい場合はgit push origin --delete <name>を使います。詳細はブランチを削除する方法を参照してください。
ls-remote と branch -r の結果が食い違う
ls-remoteはリモートの今の状態、branch -rはローカルのキャッシュです。両者が食い違うのは正常で、fetch --pruneで同期を取ると一致します。「なぜ表示が違う?」と悩む前に、まずfetchしてキャッシュを最新化してから比較してください。
fetch すればローカルブランチも最新になると思う
git fetchが更新するのはリモート追跡ブランチ(origin/mainなど)だけです。ローカルの作業ブランチ(main)は変わりません。ローカルブランチを最新化したいならgit pull(=fetch + merge)か、fetch後にgit merge origin/main/git rebase origin/mainを実行します。
認証が切れていて fetch が silent に失敗する
SSHキー期限切れ・HTTPSトークン失効などでgit fetchが失敗しても、CIの設定によっては警告だけで通過してしまうことがあります。「確認しているはずのリモート情報が古いまま」が続く場合はgit fetch -vで詳細ログを確認するか、git ls-remote originで直接疎通を確かめましょう。
よくある質問
-rはリモート追跡ブランチだけ、-aはローカル+リモート追跡の両方を表示します。現在作業中のローカルブランチは-aでは*付きで示されます。ls-remote、「ローカルから見てリモートをどう認識しているか」を確認したいならbranch -rです。CIスクリプトでブランチ存在チェックするなら副作用のないls-remoteが推奨されます。git fetch --pruneを実行してください。-rが表示するのはローカルのキャッシュなので、最新の追加・削除を反映するにはfetchが必須です。git branch -D <name>で整理してOK。git fetch --pruneで追跡情報は自動整理されます。git fetchしてからgit branch -vvを実行すると「ahead N/behind N」の形でまとめて確認できます。件数だけならgit rev-list --left-right --count origin/main...HEADが便利です。git branch -r | grep upstream/のように絞り込むか、git ls-remote --heads upstreamで対象リモートだけに直接問い合わせできます。git ls-remote --heads <URL>でURLを直接指定すればローカルに何も作らずブランチ一覧だけ取得できます。関連記事
- 【Git】originとupstreamの違いと使い分け完全ガイド — fork運用でのリモート概念
- 【Git】リモートブランチを削除しても残ってしまうときの原因と解決方法 — pruneの必要性を深掘り
- 【Git】ブランチ間の差分を比較する方法 — diffでブランチを比較
- 【Git】ブランチを削除する方法 — ローカル/リモート両方の削除
- 【Git】新しいブランチを作成する基本的な手順 — ブランチ作成の基礎
- Gitで過去のコミットから新しいブランチを作り作業をやり直す方法 — 派生ブランチの作成
- 【Git】リモートとローカルの履歴が食い違ったときの同期方法 — fetch/pull/rebaseの選び方
- 【Git】よく使うgitコマンドまとめ — 日常コマンドの早見表
まとめ
git branch -rはリモート追跡ブランチ(ローカルキャッシュ)を表示、-aでローカルも含むgit branch -vvで各ブランチのupstreamと進み遅れを一覧できる- リモート本体の今を知るなら
git ls-remoteやgit remote show - 最新化は
git fetch --all --pruneがベストプラクティス fetch.prune=trueを設定すれば自動で追跡情報が整理される- 「
branch -r=リモートの今」という誤解が最大の落とし穴
リモートブランチの確認は「ローカルキャッシュを見ているのか」「リモートに直接問い合わせているのか」を意識するだけで迷いがなくなります。fetch --pruneを習慣化し、必要に応じてls-remoteで真の最新状態を確かめる——この2つを押さえておけば、チーム開発でのブランチ管理はぐっと安定します。

