Gitでbranch(ブランチ)を削除する方法

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

Gitで開発を進めていると、マージが完了した機能ブランチや不要になった作業ブランチが増えていきます。ブランチが溜まるとリポジトリの見通しが悪くなるため、定期的に削除して整理する必要があります。

しかし、ローカルブランチとリモートブランチでは削除コマンドが異なり、オプションの指定方法を間違えるとエラーが発生したり、必要なブランチを消してしまう恐れもあります。この記事では、Gitで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/mainorigin/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.

Git公式ドキュメント - git-branch

# 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などによりリモート追跡ブランチを整理する必要があります。また、GitHubGitLabなどのホスティングサービスでは、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に渡す方法が実務上よく使われます。ただし、前述の通り--mergedHEAD基準で一覧を出す一方、-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 --mergedHEADから到達可能なブランチの一覧を取得し、次にgrep -v(指定パターンに一致しない行を抽出するフィルタコマンド)で保護したいブランチを除外します。*は現在チェックアウト中のブランチ、+は別のワークツリーでチェックアウト中のブランチに付く記号です。最後にxargs(標準入力からコマンドの引数を組み立てて実行するコマンド)で1つずつgit branch -dに渡して削除します。-dを使っているため、upstream基準で未マージと判定されたブランチはエラーでスキップされ、意図しない削除を防げます。

grep -vで候補が0件になった場合、xargsの挙動は環境によって異なることがあります。不安な場合は、まず一覧確認用コマンドだけを実行して対象ブランチがあることを確かめてから削除を実行してください。

Gitで特定パターンのbranchを一括削除する

プレフィックス(接頭辞)ごとにブランチを一括削除したい場合は、--formatオプションで機械処理に適した出力を得る方法が安全です。git branchの通常の出力は現在ブランチに*マークが付く人間向けの表示であるため、そのままgrepxargsに渡すと意図しない動作を起こす恐れがあります。

# まず削除対象の一覧だけ確認する(削除は実行されない)
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.

Git公式ドキュメント - git-reflog

リモートから削除した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やプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する