Git でローカルとリモート両方のブランチを削除する方法


ローカルブランチを削除する方法は割と馴染みがあるかもしれませんが, リモートブランチはどのように削除するのでしょうか? スタンダードな方法に加えて, 少し変わった方法も紹介します.

Git のバージョンは 2.18.0 を前提にしています.

ローカルブランチを削除する場合

ローカルブランチを削除する場合 git branch コマンドで削除することができます.

マージされているブランチを削除する場合

現在チェックアウトしているブランチにマージされているローカルブランチは -d オプションで削除できます:

git branch -d <branch>

例えばローカルの master ブランチにマージされているローカルの hotfix ブランチを削除する場合, 次のようになります:

git checkout master
git branch -d hotfix

ローカルの master ブランチにローカルの hotfix ブランチがマージされていることを確認する場合, --merged オプションで確認できます:

$ git checkout master
$ git branch --merged
  hotfix
* master

このように hotfix と表示されたら, hotfixmaster にマージされているので -d オプションで削除できると確認できます.

マージされていないブランチを削除する場合

現在チェックアウトしているブランチにマージされていないローカルブランチは -D オプションで削除できます:

git branch -D <branch>

例えばローカルの master ブランチにマージされていないローカルの hotfix ブランチを削除する場合, 次のようになります:

git checkout master
git branch -D hotfix

ローカルの master ブランチにローカルの hotfix ブランチがマージされていないことを確認する場合, --no-merged オプションで確認できます:

$ git checkout master
$ git branch --no-merged
  hotfix

このように hotfix と表示されたら hotfixmaster にマージされていないと確認できるので, hotfix を削除する場合は -d の代わりに -D オプションを使う必要があるとわかります.

リモートブランチを削除する場合

リモートレポジトリのリモートブランチを削除する場合, git push コマンドを使って削除できます.

--delete オプションで削除する場合

わかりやすく削除する場合, --delete オプションで削除できます:

git push --delete <remote> <branch>

例えばリモート originhotfix ブランチを削除する場合, 次のようになります:

git push --delete origin hotfix

: (コロン) で削除する場合

少しわかりにくく削除する場合, : (コロン) を使って削除できます:

git push <remote> :<branch>

例えばリモート originhotfix ブランチを削除する場合, 次のようになります:

git push origin :hotfix

どうして :hotfix なのかというのは, もともと次のような構文があり:

git push <remote> <src>:<dst>

<src> (ソース) にプッシュするローカルブランチを指定し, <dest> (デスティネーション) にプッシュ先のリモートブランチを指定します.

なのでローカルの master ブランチをリモート originhotfix ブランチにプッシュする場合, 次のようになります:

git push origin master:hotfix

なのでもしこの場合 master:hotfixmaster を指定しないと, プッシュするローカルブランチを指定しないことになります.

つまりは何も指定されていない無のローカルブランチをリモートブランチ hotfix にプッシュするので, hotfix が削除されることになるというように考えるといいのかもしれません.

リモートブランチを削除したら

リモートブランチを git push コマンドで削除した場合, そのリモートブランチを参照している他のコントリビュータは, 次のコマンドを実行するまでそのリモートブランチが削除されたということを確認できません:

git fetch [<remote>] --prune

例えばリモート originhotfix ブランチを削除した後, そのリモートブランチを参照している他のコントリビュータがリモートブランチ hotfix は削除されたと確認するためには, そのコントリビュータは次のコマンドを実行する必要があります:

git fetch origin --prune

もしくはリモートが origin なので, branch.<name>.remote の値が origin 以外に設定されていない限り, origin の指定を省略することもできます:

git fetch --prune

つまりはデフォルトで origin は省略可能です.

なので複数人のコントリビュータがいるレポジトリで作業している場合, 自身が参照しているリモートブランチが他の人によって削除されたかどうかを確認するためには, git fetch [<remote>] --prune を自身も実行する必要があります.

もしリモートが複数あって, 各リモートのリモートブランチ全てを削除されたかどうか確認する場合, --all オプションで確認できます:

git fetch --all --prune

まとめ

現在チェックアウトしているブランチにマージされているローカルブランチを削除する場合, git branch -d <branch> で, マージされていないローカルブランチを削除する場合, git branch -D <branch> になります.

リモートブランチを削除する場合, git push --delete <remote> <branch> もしくは git push <remote> :<branch> になります.

リモートブランチを削除した場合, 他のコントリビュータは git fetch [<remote>] [--all] --prune を実行するまで, その or それらのリモートブランチが削除されたと確認できません. 自身の場合も同様です.