【Git】リモートブランチを確認する方法|branch -r・ls-remote・fetch –prune の使い分け完全ガイド

【Git】リモートブランチを確認する方法 Git

チーム開発で「同僚が今どんなブランチをpushしているか」「リモートに自分の知らないブランチが増えていないか」「originとupstreamでブランチの状態は違うのか」を確認したい場面は頻繁にあります。このときgit branch -rだけを覚えていると、実は見ているのはローカルに残った古いキャッシュだった、という落とし穴にはまりがちです。

この記事では、Gitのリモートブランチを確認するためのコマンドを、「ローカルが認識しているリモート状態」と「リモート自身が今持っている状態」の区別から整理して解説します。branch -rbranch -als-remoteremote showfetch --pruneの使い分け、追跡ブランチの仕組み、GUIでの確認方法、よくある勘違いまで体系的にまとめます。

この記事で学べること

  • 「リモートブランチ」と「リモート追跡ブランチ」の違い
  • git branch -r-a-vvの使い分け
  • リモート直接問合せ(git ls-remote)とキャッシュ確認の違い
  • git remote showでリモート全体の状態を詳細に見る方法
  • 最新化するgit fetchと、削除済み参照を整理する--prune
  • リモートとローカルの進み遅れを比較する方法
  • よくある勘違い(古い表示・追跡ブランチの削除・ls-remoteとbranch -rの違い)
スポンサーリンク

まず押さえる:「リモートブランチ」と「リモート追跡ブランチ」は別物

Gitでは「リモートブランチ」という言葉が複数の意味で使われており、この区別を飛ばすと「git branch -rで見えているブランチが実は存在しない」といった混乱が起きます。

種類 保存場所 何を指しているか
リモートブランチ本体 GitHub/GitLabなどリモート側 リモートリポジトリ内のrefs/heads/*
リモート追跡ブランチ ローカル(.git/refs/remotes/ 前回fetchpush時点のリモートのスナップショット
ローカルブランチ ローカル(.git/refs/heads/ 自分が作業中のブランチ

ポイント:git branch -rが表示するのはローカルに保存された「リモート追跡ブランチ」です。リモート本体の現在の状態ではなく、「前回fetchした時点」のスナップショットを見ています。最新を知りたいならgit fetchでスナップショットを更新するか、git ls-remoteでリモートに直接問い合わせる必要があります。

リモートブランチ確認コマンド早見表

用途に応じて適切なコマンドを選びましょう。「ローカルキャッシュを見るのか/リモートに直接問い合わせるのか」を意識すると迷いません。

目的 コマンド リモートへ通信
リモート追跡ブランチ一覧 git branch -r なし(ローカル)
ローカル+リモート追跡を一覧 git branch -a なし
追跡設定とahead/behindを確認 git branch -vv なし
リモート全体の詳細 git remote show origin あり
リモートに直接問合せ git ls-remote origin あり
追跡ブランチを最新化 git fetch --all あり
削除済みの古い追跡を掃除 git fetch --prune あり

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は各ローカルブランチがどのリモート追跡ブランチと連動しているか、そしてリモートと比べて何コミット進んでいる/遅れているかを一覧表示します。

追跡設定とahead/behindを一覧
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表示:ローカル追跡が残っているがリモートにはもうないブランチ
  • 各ローカルブランチのpullpush先設定

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-remotefetchと違ってローカルの追跡ブランチを更新しません。「見るだけ」の操作なので、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で十分で、ローカル作業中のブランチを意図せず変更されないため安全です。

fetch vs pull
# 確認だけ(ローカルブランチは変わらない)
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漏れを確認する

未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 guigitk --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/maingit rebase origin/mainを実行します。

認証が切れていて fetch が silent に失敗する

SSHキー期限切れ・HTTPSトークン失効などでgit fetchが失敗しても、CIの設定によっては警告だけで通過してしまうことがあります。「確認しているはずのリモート情報が古いまま」が続く場合はgit fetch -vで詳細ログを確認するか、git ls-remote originで直接疎通を確かめましょう。

よくある質問

Qgit branch -r と git branch -a の違いは?
A-rはリモート追跡ブランチだけ、-aはローカル+リモート追跡の両方を表示します。現在作業中のローカルブランチは-aでは*付きで示されます。
Qgit ls-remote と git branch -r どっちを使うべき?
A「今この瞬間リモートに何があるか」を確認したいならls-remote、「ローカルから見てリモートをどう認識しているか」を確認したいならbranch -rです。CIスクリプトでブランチ存在チェックするなら副作用のないls-remoteが推奨されます。
Q新しいブランチがリモートにあるのに git branch -r で表示されない
Agit fetch --pruneを実行してください。-rが表示するのはローカルのキャッシュなので、最新の追加・削除を反映するにはfetchが必須です。
Qgone と表示されるブランチは何?
Aリモート側では既に削除されているが、ローカルに追跡情報だけ残っている状態です。未マージ作業がなければgit branch -D <name>で整理してOK。git fetch --pruneで追跡情報は自動整理されます。
Q自分のローカルブランチがリモートと比べてどれだけ進んでいるか知りたい
Agit fetchしてからgit branch -vvを実行すると「ahead N/behind N」の形でまとめて確認できます。件数だけならgit rev-list --left-right --count origin/main...HEADが便利です。
Qoriginとupstreamの両方があるときに、特定リモートだけのブランチを見たい
Agit branch -r | grep upstream/のように絞り込むか、git ls-remote --heads upstreamで対象リモートだけに直接問い合わせできます。
Qcloneせずにリモートのブランチ一覧だけ見ることはできる?
Aはい。git ls-remote --heads <URL>でURLを直接指定すればローカルに何も作らずブランチ一覧だけ取得できます。

関連記事

まとめ

  • git branch -rはリモート追跡ブランチ(ローカルキャッシュ)を表示、-aでローカルも含む
  • git branch -vvで各ブランチのupstreamと進み遅れを一覧できる
  • リモート本体の今を知るならgit ls-remotegit remote show
  • 最新化はgit fetch --all --pruneがベストプラクティス
  • fetch.prune=trueを設定すれば自動で追跡情報が整理される
  • branch -r=リモートの今」という誤解が最大の落とし穴

リモートブランチの確認は「ローカルキャッシュを見ているのか」「リモートに直接問い合わせているのか」を意識するだけで迷いがなくなります。fetch --pruneを習慣化し、必要に応じてls-remoteで真の最新状態を確かめる——この2つを押さえておけば、チーム開発でのブランチ管理はぐっと安定します。