Gitで開発を進めていると、マージが完了した機能ブランチや不要になった作業ブランチが増えていきます。ブランチが溜まるとリポジトリの見通しが悪くなるため、定期的に削除して整理する必要があります。
しかし、ローカルブランチとリモートブランチでは削除コマンドが異なり、オプションの指定方法を間違えるとエラーが発生したり、必要なブランチを消してしまう恐れもあります。この記事では、Gitでbranchを削除するコマンドを一覧表で整理したうえで、ローカル・リモートそれぞれの削除手順や一括削除の方法、誤って削除した場合の復元手順まで解説します。
目次
- Gitでbranchを削除するコマンド一覧
- Gitでローカルbranchを削除するコマンド
- Gitでリモートbranchを削除するコマンド
- Gitでリモート追跡branchを削除するコマンド
- Gitでローカルbranchを削除する手順
- Gitでマージ済みbranchを削除する
- Gitで未マージbranchを強制削除する
- Gitでリモートbranchを削除する手順
- git pushでリモートbranchを削除する
- git fetch --pruneでリモート追跡branchを削除する
- Gitでbranchを一括削除する方法
- Gitでマージ済みbranchを一括削除する
- Gitで特定パターンのbranchを一括削除する
- Gitのbranch削除で発生するエラーの対処法
- not fully mergedエラーの対処法
- Cannot delete branchエラーの対処法
- Gitで削除したbranchを復元する方法
- reflogでコミットハッシュを確認して復元する
- リモートから削除したbranchを復元する
Gitでbranchを削除するコマンド一覧
Gitでブランチを削除するコマンドは、削除対象がローカルブランチかリモートブランチかによって異なります。以下の一覧表で、用途ごとのコマンドを確認してください。各コマンドの詳しい条件や注意点は後続の見出しで解説します。
| 削除対象 | コマンド | 条件・補足 |
|---|---|---|
| ローカルブランチ(安全削除) | git branch -d ブランチ名 |
upstreamまたはHEADにマージ済みの場合のみ |
| ローカルブランチ(強制削除) | git branch -D ブランチ名 |
マージ状態を問わず削除 |
| リモートブランチ | git push origin --delete ブランチ名 |
リモートリポジトリ上のブランチを削除 |
| リモート追跡ブランチ(一括整理) | git fetch --prune |
リモートで削除済みの参照をローカルから除去 |
Gitでローカルbranchを削除するコマンド
ローカルブランチとは、自分のPC上のリポジトリにのみ存在するブランチのことです。ローカルブランチの削除にはgit branchコマンドに-dまたは-Dオプションを指定します。
# マージ済みのローカルブランチを安全に削除
git branch -d ブランチ名
# マージ状態に関係なくローカルブランチを強制削除
git branch -D ブランチ名
-dは--deleteの省略形で、対象ブランチがマージ済みと判定された場合にのみ削除を実行します。-Dは--delete --forceの省略形で、マージ済み判定を無視してブランチ参照を強制的に削除します。-dの判定基準や具体的な手順は「Gitでローカルbranchを削除する手順」で詳しく解説します。
Gitでリモートbranchを削除するコマンド
リモートブランチとは、GitHubやGitLabなどのリモートリポジトリ上に存在するブランチのことです。リモートブランチの削除にはgit pushコマンドに--deleteオプションを付けて実行します。
# リモートブランチを削除
git push origin --delete ブランチ名
git push origin :ブランチ名という省略形でも同じ結果を得られますが、--deleteのほうが意図が明確です。コマンドの詳しい使い方やチーム運用での注意点は「Gitでリモートbranchを削除する手順」で解説します。
Gitでリモート追跡branchを削除するコマンド
リモート追跡ブランチとは、リモートリポジトリ上のブランチの状態をローカルに記録した参照のことで、origin/mainやorigin/feature/loginのような形式で表示されます。リモートで既に削除されたブランチのリモート追跡ブランチは、git fetch --pruneで一括整理できます。
# リモートで削除済みのリモート追跡ブランチを一括整理
git fetch --prune
git branch -d -r origin/ブランチ名で個別に削除する方法もありますが、リモート側にそのブランチがまだ存在する場合は次回のgit fetchで再作成されます。それぞれのコマンドの詳細や自動化設定は「git fetch --pruneでリモート追跡branchを削除する」で解説します。
Gitでローカルbranchを削除する手順
ローカルブランチの削除は、マージ済みかどうかによって使うオプションが変わります。安全な-dオプションと強制的な-Dオプションの2つを、具体的な手順とともに解説します。
【PR】プログラミングや生成AIを無料で学べる「コードキャンプフリー」
Gitでマージ済みbranchを削除する
マージが完了したブランチは、git branch -dコマンドで安全に削除できます。-dは、対象ブランチがupstream branchにfully merged(完全にマージ済み)である場合、またはupstreamが未設定ならHEADから到達可能な場合にのみ削除を実行します。upstreamとは、git branch --set-upstream-toや--trackで設定される比較先の上流ブランチのことで、通常はorigin/mainのようなリモート追跡ブランチ(リモートの状態をローカルに記録した参照)を指しますが、概念上はローカルブランチも設定可能です。
HEADは現在チェックアウトしている位置を表し、通常は現在のブランチ先端を指しますが、特定のコミットを直接チェックアウトしたdetached HEAD状態もあります。削除する前に、まず対象ブランチ以外のブランチ(通常はmainやmaster)にチェックアウト(切り替え)しておく必要があります。現在チェックアウト中のブランチは削除の対象にできないためです。
Delete a branch. The branch must be fully merged in its upstream branch, or in HEAD if no upstream was set with --track or --set-upstream-to.
# mainブランチに切り替える
git switch main
# マージ済みのfeature/loginブランチを削除する
git branch -d feature/login
削除が成功すると、Deleted branch feature/login (was a1b2c3d).のようなメッセージが表示されます。括弧内のSHA(16進数の文字列)は、削除したブランチ先端が指していたコミットの識別子です。万が一復元が必要になった場合、このSHA値が手がかりになります。
削除前にマージ済みブランチの一覧を確認したい場合は、git branch --mergedコマンドが便利です。このコマンドは、現在のHEADから到達可能なブランチを一覧表示します。ただし、git branch -dの削除可否判定はupstreamが設定されているとupstream基準になるため、--mergedに表示されても-dで削除できないケースがあります。不安な場合は、まず-dで実行してエラーが出るかどうかで判断してください。
# HEADから到達可能なブランチの一覧を表示する
git branch --merged
# HEADから到達不能なブランチの一覧を表示する
git branch --no-merged
--mergedの一覧は削除候補を把握する目安として活用できますが、-dで削除可能かどうかの最終判定はGit自身が行います。-dで拒否された場合のエラー内容と対処法は「not fully mergedエラーの対処法」を参照してください。
Gitで未マージbranchを強制削除する
開発方針の変更や実験的な作業の破棄など、意図的に未マージの変更を破棄してブランチを削除したい場合は、-Dオプションを使用します。-dで削除しようとした際にエラーが出た場合の詳しい原因と対処法は「not fully mergedエラーの対処法」を参照してください。
# 未マージのブランチを強制削除する
git branch -D feature/experimental
-Dオプションは--delete --forceと同義で、マージ済み判定を無視してブランチ参照を削除します。ブランチ参照が消えるだけで、コミットオブジェクト(変更履歴の実体データ)自体はすぐには消去されません。後述するreflog(参照ログ)を使った復元で回復できる可能性がありますが、取り消しが容易ではないことに変わりはないため、削除前にブランチの変更内容が本当に不要であるか確認してください。
削除後もしばらくはコミットオブジェクトやreflogが残りますが、reflogの保持期限切れやGC(ガベージコレクション、不要データの自動回収処理)/ pruneの実行によって復元が難しくなります。-Dを使う場面では、必要な変更が別ブランチやリモートに退避済みであることを確認してから実行する習慣をつけてください。
Gitでリモートbranchを削除する手順
リモートブランチの削除には、直接リモートのブランチを削除する方法と、リモートで既に削除されたブランチの参照をローカルから整理する方法の2つがあります。
git pushでリモートbranchを削除する
リモートリポジトリ上のブランチを直接削除するには、git pushコマンドに--deleteオプションを付けて実行します。git push origin :ブランチ名という省略形でも同じ結果を得られますが、--deleteのほうが意図が明確で読みやすいため、チーム開発ではこちらを推奨します。
# リモートのfeature/loginブランチを削除する(推奨)
git push origin --delete feature/login
# 省略形(同じ結果を得られる)
git push origin :feature/login
省略形は、空のローカル参照をリモートにプッシュすることによって結果的にリモートブランチを削除する仕組みです。コマンドが成功すると、- [deleted] feature/loginというメッセージが表示されます。リモートブランチが削除されたあと、自分のローカル環境のリモート追跡ブランチ(origin/feature/login)はgit fetch --pruneで整理すると確実です。環境によっては自動的に消える場合もありますが、明示的にpruneを実行するほうが安全です。
他のメンバーのローカル環境には依然としてリモート追跡ブランチが残っているため、各メンバーの環境でもgit fetch --pruneなどによりリモート追跡ブランチを整理する必要があります。また、GitHubやGitLabなどのホスティングサービスでは、Web UIからブランチを削除できるほか、プルリクエストのマージ後にブランチを自動削除する設定も用意されています。これらはGitの一般仕様ではなくサービス固有の機能であるため、利用時は各サービスのドキュメントを確認してください。
git fetch --pruneでリモート追跡branchを削除する
他のメンバーがリモートブランチを削除した場合、自分のローカル環境にはリモート追跡ブランチが残り続けます。このような実体のないリモート追跡ブランチは、git fetch --pruneコマンドで一括して整理できます。--pruneオプション(省略形は-p)を付けることで、stale(古くなって実体のない)リモート追跡ブランチを一掃します。
# リモートで削除済みのリモート追跡ブランチを整理する
git fetch --prune
# 特定のリモート追跡ブランチを個別に削除する
git branch -d -r origin/ブランチ名
git remote prune originでも同様の結果が得られますが、git fetch --pruneはブランチ情報の取得と整理を1回のコマンドで完了できるため効率的です。git branch -d -r origin/ブランチ名はローカルのリモート追跡ブランチ参照だけを個別に削除するコマンドですが、リモート側にそのブランチがまだ存在し通常どおりfetch対象になっている場合は、次回のgit fetchで再作成される点に注意してください。
Use -r together with -d to delete remote-tracking branches. Note, that it only makes sense to delete remote-tracking branches if they no longer exist in the remote repository or if git fetch was configured not to fetch them again.
— Git公式ドキュメント - git-branch
毎回--pruneを付けるのが手間な場合は、以下のGit設定を有効にすることで、git fetchのたびに自動的にpruneが実行されるようにできます。
# git fetchのたびにpruneを自動実行する設定
git config --global fetch.prune true
この設定はグローバル設定としてPC上の全リポジトリに適用されます。チーム開発でブランチの入れ替わりが頻繁な場合は有効にしておくと、リモート追跡ブランチの表示をリモートの実態に近い状態へ保ちやすくなります。
Gitでbranchを一括削除する方法
ブランチが大量に溜まっている場合、1つずつ削除するのは非効率です。パイプライン(複数のコマンドを連結して処理するシェルの仕組み)を使ったワンライナー(1行で実行するコマンド)で、複数のブランチをまとめて削除できます。以下のワンライナーはbash / zshなどのUnix系シェル向けの簡便策です。git branchの人間向け出力を文字列処理しているため、実務では便利ですが、初心者はまず一覧表示だけ実行して対象を確認してから削除してください。
【PR】『Python』を学べる企業・個人向けのプログラミングコース
Gitでマージ済みbranchを一括削除する
マージが完了したブランチをまとめて削除するには、git branch --mergedの出力をパイプでつないでgit branch -dに渡す方法が実務上よく使われます。ただし、前述の通り--mergedはHEAD基準で一覧を出す一方、-dはupstreamが設定されていればupstream基準で判定するため、一覧に出ても-dで削除できないケースがあります。
# まず削除対象の一覧だけ確認する(削除は実行されない)
git branch --merged | grep -v -E '^\*|^\+|^main$|^master$'
# 確認後、一括削除を実行する
git branch --merged | grep -v -E '^\*|^\+|^main$|^master$' | xargs -n 1 git branch -d
このコマンドは3つの処理を順番に実行しています。まずgit branch --mergedでHEADから到達可能なブランチの一覧を取得し、次にgrep -v(指定パターンに一致しない行を抽出するフィルタコマンド)で保護したいブランチを除外します。*は現在チェックアウト中のブランチ、+は別のワークツリーでチェックアウト中のブランチに付く記号です。最後にxargs(標準入力からコマンドの引数を組み立てて実行するコマンド)で1つずつgit branch -dに渡して削除します。-dを使っているため、upstream基準で未マージと判定されたブランチはエラーでスキップされ、意図しない削除を防げます。
grep -vで候補が0件になった場合、xargsの挙動は環境によって異なることがあります。不安な場合は、まず一覧確認用コマンドだけを実行して対象ブランチがあることを確かめてから削除を実行してください。
Gitで特定パターンのbranchを一括削除する
プレフィックス(接頭辞)ごとにブランチを一括削除したい場合は、--formatオプションで機械処理に適した出力を得る方法が安全です。git branchの通常の出力は現在ブランチに*マークが付く人間向けの表示であるため、そのままgrepやxargsに渡すと意図しない動作を起こす恐れがあります。
# まず削除対象の一覧だけ確認する(削除は実行されない)
git branch --format='%(refname:short)' | grep '^feature/'
# 確認後、安全に一括削除する(-dで未マージはスキップ)
git branch --format='%(refname:short)' | grep '^feature/' | xargs -n 1 git branch -d
# 未マージも含めて強制削除する場合(慎重に実行すること)
git branch --format='%(refname:short)' | grep '^feature/' | xargs -n 1 git branch -D
--format='%(refname:short)'を使うと、*マークや余分な空白を含まないブランチ名だけが出力されるため、パイプ処理が壊れにくくなります。まず-dで実行し、未マージのブランチはエラーでスキップさせるのが安全です。-Dによる強制削除は、本当に不要であることを確認したうえで実行してください。
また、リモートで既に削除されたブランチだけをローカルから削除したい場合があります。git branch -vvの出力でupstream情報に[gone]が表示されるブランチは、対応するupstreamが消えている目安です。ただし、git branch -vvの出力は人間向けの表示で形式がバージョンや環境によって微妙に異なる可能性があるため、awk(テキスト処理コマンド)やgrepで機械処理するワンライナーは壊れやすい面があります。初心者には一覧で[gone]を確認したあと、個別にgit branch -d ブランチ名で削除する方法を推奨します。
# リモートの最新情報を取得してから、goneブランチを確認する
git fetch --prune
git branch -vv | grep ': gone]'
上記の出力結果を目視で確認し、削除して問題ないブランチだけを個別にgit branch -dで削除してください。この手順であれば、ワンライナーの誤動作によるデータ消失を避けられます。
Gitのbranch削除で発生するエラーの対処法
ブランチを削除しようとした際に、コマンドが失敗してエラーメッセージが表示される場合があります。代表的なエラーとその対処法を2つ解説します。
not fully mergedエラーの対処法
git branch -dで削除しようとした際にerror: The branch 'ブランチ名' is not fully merged.と表示された場合、対象ブランチ先端のコミットがupstreamまたはHEADから到達可能でないことを意味します。実務上は「未マージなので削除を拒否された」と理解して差し支えありません。
# エラーメッセージの例
$ git branch -d feature/experimental
error: The branch 'feature/experimental' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/experimental'.
対処方法は2つあります。1つ目は、先にブランチの変更内容をマージしてから-dで削除する方法です。2つ目は、変更内容が不要であると判断した場合に-Dオプションで強制削除する方法です。エラーメッセージにもgit branch -Dを使うよう案内が表示されます。
注意点として、upstreamが設定されていてリモートにはプッシュ済みだがHEADにはマージされていない場合にも、warningが表示されることがあります。この場合はwarning: not deleting branch 'ブランチ名' that is not yet merged to 'refs/remotes/origin/ブランチ名'のようなメッセージが出力されます。リモートに変更が保存されていることを確認したうえで、-Dで削除するかどうかを判断してください。
Cannot delete branchエラーの対処法
ブランチの削除時にerror: Cannot delete branch 'ブランチ名' checked out at '/path/to/repo'と表示された場合、現在チェックアウト中のブランチを削除しようとしていることが原因です。Gitでは、作業中のブランチを削除する操作は許可されていません。
# エラーの発生例
$ git branch -d main
error: Cannot delete branch 'main' checked out at '/home/user/project'
# 別のブランチに切り替えてから削除する
$ git switch develop
$ git branch -d feature/old-task
対処法はシンプルで、git switchまたはgit checkoutで削除対象以外のブランチに切り替えてから、削除コマンドを再実行するだけです。切り替え先はmainやdevelopなど、通常は削除しない長寿命ブランチを選ぶと安全です。
また、git worktree(1つのリポジトリに対して複数の作業ディレクトリを作成する機能)で別のワークツリーがそのブランチをチェックアウトしている場合にも同じエラーが発生します。その場合は、該当するワークツリー内で別のブランチに切り替えるか、ワークツリーを削除する必要があります。もし既に別ワークツリーのディレクトリを手動で削除しているのに同種のエラーが出る場合は、git worktree pruneで古いワークツリー情報を整理すると解消することがあります。
Gitで削除したbranchを復元する方法
誤ってブランチを削除してしまった場合でも、Gitの仕組みを利用して復元できる場合があります。ローカルで削除した場合とリモートから削除した場合で手順が異なるため、それぞれの復元方法を解説します。
reflogでコミットハッシュを確認して復元する
ローカルで削除したブランチは、reflog(参照ログ)を使って復元できます。reflogとは、HEADやブランチの参照が移動した履歴をローカルに記録する仕組みのことです。ブランチを削除してもコミットオブジェクト自体はすぐには消えないため、reflogからコミットハッシュを特定してブランチを再作成できます。
# reflogでHEADの移動履歴を確認する
git reflog
# 出力例
a1b2c3d HEAD@{0}: checkout: moving from feature/login to main
f4e5d6c HEAD@{1}: commit: ログイン機能を実装
b7a8e9f HEAD@{2}: checkout: moving from main to feature/login
# 削除したブランチを復元する(コミットハッシュを指定)
git branch feature/login f4e5d6c
git reflogの出力から、復元したいブランチの先端コミットに対応するSHA(16進数のハッシュ値)を確認します。上記の例ではf4e5d6cがfeature/loginブランチの先端コミットです。このハッシュ値を指定してgit branch ブランチ名 ハッシュ値を実行すると、指定したコミットを先端とするブランチが再作成されます。HEAD@{番号}の形式でも指定可能で、git branch feature/login HEAD@{1}と書いても同じ結果が得られます。なお、upstreamの設定など、ブランチ固有の設定は自動では復元されないため、必要に応じて別途設定し直してください。
reflogの記録には保持期限があり、デフォルトでは到達可能なコミットの参照は90日間(gc.reflogExpire)、到達不能なコミットの参照は30日間(gc.reflogExpireUnreachable)保持されます。この期限を過ぎると、reflogのエントリが期限切れとなり、GC / pruneの実行によって復元が難しくなります。誤削除に気づいた場合は早めに復元してください。HEADのreflogに目的のコミットが見つからない場合は、git fsck --lost-foundで到達不能なコミットを探すなど、追加の調査が必要になることがあります。
git reflog is used to record when the tips of branches and other references were updated in the local repository.
リモートから削除したbranchを復元する
リモートブランチを誤って削除した場合は、ローカルにそのブランチのコピーが残っていれば、再度プッシュするだけで復元できます。以下の手順で、ローカルのブランチをリモートに再登録してください。
# ローカルに残っているブランチをリモートに再プッシュする
git push origin feature/login
ローカルにもブランチが残っていない場合は、前述のreflogを使った方法でまずローカルブランチを復元し、そのあとリモートにプッシュする流れになります。また、チームメンバーのローカル環境にブランチのコピーが残っている場合は、そのメンバーからプッシュしてもらうことでも復元できます。
GitHubでは、条件を満たすclosed pull requestのhead branchを、Web UIの「Restore branch」ボタンから復元できます。この機能はプルリクエストと関連付けられたブランチに限定されるため、すべてのブランチが対象ではありません。ほかのホスティングサービスでも類似機能がある場合がありますが、対応状況はサービスやバージョンによって異なります。リモートブランチの削除はチーム全体に影響するため、削除前の確認と復元手順を事前に把握しておくことが大切です。
You can restore the head branch of a closed pull request.
— GitHub Docs - Deleting and restoring branches in a pull request
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
【PHP】define関数による定数の使い方や定義方法を解説
Illustrator(イラストレーター)で様々な図形の作り方を解説
CSSのstickyプロパティでWebサイトに固定要素を実装する方法
Dockerfileの基本的な使い方とビルド方法を簡単に解説
PHPのコメントの書き方とDocCommentの使い方を簡単に解説
【初心者向け】データベースの基本的な作り方を簡単に解説
【PHP】PDOでMySQLに接続する方法を簡単に解説
【WordPress】絞り込み検索機能を自作する方法をサンプルコードと併せて解説
【PHP】コードの動作確認をローカル・オンラインで行う方法
MacでWordPressのローカル環境を構築する方法を解説
ITやプログラミングに関するニュース
フラー株式会社がアプリ市場トレンド解説ウェビナーを3月25日に開催、成長アプリの共通項とデータ活用を解説
株式会社BOTANICOが2026年版X運用最新戦略ウェビナーを開催、成果につなげる資産型運用を解説
AIストーム株式会社がOpenClaw活用セミナーを開催、AIエージェントがビジネス現場を変革
株式会社オロが建設コンサルティング業向けウェビナーを開催、技術部門の損益可視化を支援
アルティウスリンク株式会社が経理向けBPO活用ウェビナーを開催、課題解決と業務効率化を支援
株式会社日本計画研究所がAI時代のインフラセミナー開催、GPUとデータセンターの課題を解説
株式会社カウンターワークスがリーシング業務AI活用ウェビナー開催、既存ツールでAIエージェント実践
株式会社セキドがDJI産業機セミナーを福井で開催、3Dデータ活用と機材選定を無料解説
株式会社ナビットが補助金活用ウェビナーを開催、販促費削減と集客力向上を解説




