Gitでリモートブランチを削除する方法

最終更新:2022-02-22 by Joe

Git でのリモートブランチの削除に関するコマンドと解説です。

リモートブランチを削除する Git コマンド

ローカルブランチは「git branch -d」というおおよそ直感的なコマンドで削除できます。一方で、リモートブランチや、リモート追跡ブランチは少し勝手が違います。ちゃんと削除しないとどんどん溜まってしまいますので、これらを整理していきましょう。

リモートブランチの削除コマンドのポイントは「git push」コマンドを使う点です。2種類の方法がありますが、まず一つは、--deleteオプションを付け git push を行う方法です。

# 方法1)リモートブランチを削除する
$ git push --delete origin <remote branch name>

また下記も同じ効果を得られる、別のgit pushコマンドです。

# 方法2)リモートブランチを削除する
$ 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 には、このようなリモート追跡ブランチも削除するコマンドが用意されてます。

# リモートトラッキングブランチを削除
$ 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ライフを。