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
と表示されたら, hotfix
は master
にマージされているので -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
と表示されたら hotfix
は master
にマージされていないと確認できるので, hotfix
を削除する場合は -d
の代わりに -D
オプションを使う必要があるとわかります.
リモートブランチを削除する場合
リモートレポジトリのリモートブランチを削除する場合, git push
コマンドを使って削除できます.
--delete
オプションで削除する場合
わかりやすく削除する場合, --delete
オプションで削除できます:
git push --delete <remote> <branch>
例えばリモート origin
の hotfix
ブランチを削除する場合, 次のようになります:
git push --delete origin hotfix
:
(コロン) で削除する場合
少しわかりにくく削除する場合, :
(コロン) を使って削除できます:
git push <remote> :<branch>
例えばリモート origin
の hotfix
ブランチを削除する場合, 次のようになります:
git push origin :hotfix
どうして :hotfix
なのかというのは, もともと次のような構文があり:
git push <remote> <src>:<dst>
<src>
(ソース) にプッシュするローカルブランチを指定し, <dest>
(デスティネーション) にプッシュ先のリモートブランチを指定します.
なのでローカルの master
ブランチをリモート origin
の hotfix
ブランチにプッシュする場合, 次のようになります:
git push origin master:hotfix
なのでもしこの場合 master:hotfix
の master
を指定しないと, プッシュするローカルブランチを指定しないことになります.
つまりは何も指定されていない無のローカルブランチをリモートブランチ hotfix
にプッシュするので, hotfix
が削除されることになるというように考えるといいのかもしれません.
リモートブランチを削除したら
リモートブランチを git push
コマンドで削除した場合, そのリモートブランチを参照している他のコントリビュータは, 次のコマンドを実行するまでそのリモートブランチが削除されたということを確認できません:
git fetch [<remote>] --prune
例えばリモート origin
の hotfix
ブランチを削除した後, そのリモートブランチを参照している他のコントリビュータがリモートブランチ 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 それらのリモートブランチが削除されたと確認できません. 自身の場合も同様です.
関連記事
Git の Remote コマンドの使い方2018.06.06
GitHub のレポジトリをクローンする際, HTTPS で指定された URL を SSH 用の URL として扱う方法2018.10.31
Git の 3-way マージで共通祖先が 2 つの場合, 共通祖先はどんな感じになるのか調べてみた2018.08.22
git rebase でヒストリを直線的にする方法と使う時の注意点2018.08.13
Git で変更されたファイルを部分的にステージする方法2018.11.01