Git でのブランチの削除に関するコマンドと解説です。
ローカルブランチは「git branch -d」というおおよそ直感的なコマンドで削除できます。一方で、リモートブランチは・・、?となる初学者は非常に多いと思います。リモートブランチや、リモート追跡ブランチもちゃんと削除しないとどんどん溜まってしまいます。これらを整理するための方法をまとめます。
目次
ローカルブランチを削除する Git コマンド
ブランチを削除する「git branch -d」
ローカルブランチの削除コマンドから。「git branch -d <BRANCH_NAME>」のオプション付きで、削除できます。
// ローカルブランチを削除(すべて同義)
$ git branch -d
$ git branch --delete
強制削除の「git branch -D」
上記のブランチの削除では、HEAD(=現在のブランチの先頭)にマージされていない場合、エラーがでて削除できません。これはすなわち、ブランチ削除操作により変更履歴をたどる方法が失われてしまう場合です。(とはいえ、コミットオブジェクト自体は残りますので、復元は可能です。Git における「ブランチ」とはコミットへの参照でしかありません)
このようなケースでも、不要なことがわかっているブランチは、「-D」オプションを使って、強制的に削除が可能です。
// マージされていないローカルブランチを強制的に削除(すべて同義)
$ git branch -D
$ git branch -df
$ git branch --delete --force
大文字のDは、--delete --forceのショートハンドというわけですね。
ちなみに、未マージのブランチも、そのブランチに「上流ブランチ」が設定してあって、すでにリモートに Push されていれば、警告はでますが、削除できます。
上流ブランチについては、こちらに詳しくまとめました。
マージされていない不要なブランチを探そう!
ちなみに、マージ済み(HEADにつながっている)のブランチと、マージされていないブランチは、それぞれ下記のコマンドで一覧できます。不要なブランチを探すのに役立つでしょう。
// マージ済のブランチの一覧
$ git branch --merged
// マージされていないブランチを一覧
$ git branch --no-merged
リモートブランチを削除する Git コマンド
リモートブランチの削除コマンドのポイントは「git push」コマンドを使う点です。
2種類の方法がありますが、まず一つは、--deleteオプションを付けgit pushを行う方法です。
// リモートブランチを削除する
$ git push --delete origin <remote branch name>
また下記も同じ効果を得られる、別のgit pushコマンドです。
// リモートブランチを削除する
$ git push origin :<remote branch name>
2つめの意味がややわかりにくいですが、git pushコマンドには <local branch>:<remote branch>というコロンで区切るオプションが存在します。上記の削除コマンドでは、<空文字>:<remote branch>という表現で「何もない」をプッシュすることで、「削除する」コマンドという解釈になるようです。
この:<remote branch>というのはオプショナルで、指定しない時(通常は指定しないことが多いと思います)の振る舞いは<local branch>と同じ名前のリモートブランチ名がプッシュの対象になるようです。
git push の振る舞いに関しては、こちらに詳しくまとめました:

git push がリモートブランチの削除に利用できるんだね。
リモート追跡ブランチを削除する Git コマンド
上述のリモートブランチ削除操作によって、自分が作成したリモート追跡は同時に削除されます。一方で、チームの他のメンバーがリモートブランチを削除した場合は、リモートとローカルのブランチを削除しても、リモート追跡トラッキング(=追跡)ブランチはしっかりと残ってしまいます。このまま放っておいてもあなたのローカルにあるリモート追跡ブランチはずっと残ったままになってしまいます。
Git には、このようなリモート追跡ブランチも削除するコマンドが用意されてます。
// リモートトラッキングブランチを削除
$ git branch -dr <remote tracking branch>
// 上記と同義
$ git branch -d -r <remote tracking branch>
$ git branch --delete -remotes <remote tracking branch>
「-r」は「--remotes」のショートハンドですね。リモートが存在しない場合、普通リモート追跡ブランチもいらない事がほとんどなので、不要な場合は忘れずに削除しておきましょう。

どんどん溜まってしまうから、ときどき整理したいね。
【補足1】削除したブランチを復活させる
間違ってブランチを削除しても、ローカルブランチであれば、git branch コマンドを利用して元に戻せます
// 過去のHEADの移動をリスト
$ git reflog
// 過去の特定のコミットでブランチを再度作成
$ git branch <ブランチ名> HEAD@{6}
BRANCH_NAME に元々のブランチ名か、新しいブランチ名を指定して下さい、HEAD@{N} を起点に、ブランチが改めて生成されます。

git reflog は、参照(refs)の移動をすべて記録(log)してくれているんだったね。
【補足2】--prune オプションを用いた追跡ブランチ削除について
リモートとの関連のあるgit コマンドの多くは、「--prune」と呼ばれるオプションを持っています。これらは、ローカルのブランチと、リモートのブランチとの差分をみて、リモートのブランチ有無とローカルのそれの整合を取るような動きをします。このオプションを用いて、ブランチを削除することもできます。
git fetch 時に、不要なリモート追跡ブランチを削除する
fetch に--pruneを追加した例です。リモート→リモート追跡 のシンクさせる意味で、使い勝手のよいコマンドです。リモートレポジトリで(下記では、origin で)もしすでに削除されているブランチがあれば、対応する追跡ブランチを削除してくれます。
// リモート(origin)で削除されたブランチに対応する追跡ブランチを削除
$ git fetch --prune
Git のブランチ削除に関する参考リンク
Gitマニュアルは、なんでも書いてありますね。オプションを探すのがちょっと大変ですが。
さて、以上になります。うまくブランチを削除できたでしょうか?それでは、快適なgitライフを。
誤った削除操作で、ブランチにアクセスできなくなってしまう事がないように、安全になっているんだね。