Git + GitHubで不要になったブランチを認識・削除する

主に趣味でGitやGitHubを使うことがある. 開発の過程でブランチを切ってはマージし切ってはマージし,といったサイクルを回すことになるが,マージしたブランチについては不要なものとなる. 不要なものは削除したほうがゴミが少なくて気分が良いので,適宜消そうと思ったのでやりかたを調べた.

Gitのクライアントに関してはOS XCUIツールを使っている(ので,SourceTreeのこととかは全然分からない).

GitHub上でマージしたブランチを消す

これはかんたん.マージしたときにdelete branch みたいなボタンが出てくるからポチるだけ. あるいはbranchの一覧でマージされたブランチはmergedみたいなアイコンが出るからゴミ箱のアイコンをクリックしてもよい.

削除されたリモートブランチをローカルでも削除する

上の手順などでGitHubなどにあるリモートリポジトリが削除されているが,git fetchなどで一度ローカルに落としたリモートブランチは自動では消えてくれない.

この場合,

$ git remote prune origin

とコマンドを叩くと既に削除されたリモートブランチをローカルからも削除することができる.

どのブランチが消されたか分からなくて怖い場合は

$ git remote prune origin --dry-run

とすればいい.

また,fetch時にまとめてやってくれよという兄貴のために

$ git fetch --prune

といったfetchのオプションも存在する.

mergeされたローカルブランチを消す

GitHub上でマージしたブランチを消した場合,もとになったローカルブランチは当然削除されない. しかしmergeされたことはちゃんと認識できているので(Gitすごい!),mergeされたブランチを一覧表示・削除できればよい.

まず,mergeされたブランチの表示は

$ git branch --merged

でできる.

ブランチの削除は

$ git branch -d mergedBranch

でできる.「マージできてねえぞオラ!」みたいな怒られが発生したときは

$ git branch -D mergedBranch

で強制削除もできる(が,なるべくならしない方がいいし,する前にdiffなどを取って確認した方がいい).

この2つのコマンドをカタカタ打っていけば基本的にはいいのだが,ブランチ名をいちいち手打ちするのが面倒だよーって場合がある. そんなときは

$ git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %

で一括消去できる.xargsさんはやはりできるやつだ. また,他にも削除したくないブランチがあればgrepの条件をいい感じに変えてやれば良い.

削除されるブランチ(正確にはxargsで実行されるコマンド)を確認したいときには

$ git branch --merged | grep -vE '^\*|master$|develop$' | xargs -p -I % git branch -d %

で多分行けるはず.

(追記)やってみたらインタラクティブにY/n聞かれるやつだった.xargsさんすごいな?ちょう便利じゃん.

参考にした記事