ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Squash and Merge されたブランチも削除できる git-branch-delete-merged をリリースしました

開発をしているとローカルブランチはガンガン溜まっていきます。
仕事だと平均1日1ブランチ作るくらいだと思いますので、2ヶ月放っておくと40ブランチくらいがローカルに存在します……。

そのままでいると git checkout するときの自動補完の候補が出すぎて面倒になってきますので、
じゃあローカルブランチを削除するか〜と思っても、1件1件削除していくのはなかなか大変です。

どのブランチが作業中で、どれが消していいのか、
ブランチ名からだとわからないこともあります。古いものだと特に。

git branch --merged というコマンドもありますが、
プルリクエストを「Squash and merge」している場合には、マージ済みブランチとして表示されてくれません。

そこで作ったのがこちら!
git-branch-delete-merged というCLIアプリケーションです!!

github.com

マージしたブランチも、「Squash and merge」したブランチも、
削除候補として表示され、その削除候補のブランチの git log も見られるので
不安なものはそれを確認の上、安心してブランチ削除をすることができます!

go install github.com/nekonenene/git-branch-delete-merged@v1

で簡単にインストールすることができますし、
リリースページから圧縮済みバイナリファイルをダウンロードすることも可能です。

なお、これでローカルブランチの削除をおこなったあとは、

git remote prune origin

のコマンドで、ローカルに残っているリモートブランチ情報を削除しておくのがオススメです。

参考: リモートで消されたブランチが手元で残ってしまう件を解消する - Qiita

開発裏話

git-delete-squashed

リポジトリの README にも書いていますが、今回のコードは
https://github.com/not-an-aardvark/git-delete-squashed を大いに参考にしています。

「Squash and merge」したブランチを削除する方法を探していて
このリポジトリを見つけ使おうと思ったのですが、
コードを読んでいくと、確認なく対象ブランチをすべて削除してしまうと気付いて、
それはちょっと怖いな……って思いました。であれば作ろうかなと。

前回のブログ記事でも書きましたが、この作者さん天才です。
このリポジトリがなければ今回のCLIアプリケーションは作れませんでした。

Rust か Go か

最初は Rust で作ってみようと思って
Learning Rust by Writing a Command Line App in 15 Minutes を読んで
https://github.com/nekonenene/grrs-rust-practiceリポジトリで練習していたのですが、
「やっぱ Rust 難しいわ……」ってなって慣れている Go で書くことにしました。

今回作ったものを Rust で書き直す、というのは難易度がちょうどよさそうなのでやりたいですね。

【追記:実際に Rust でも書いてみました! ↓】

nekonenene.hatenablog.com

他OSへのクロスコンパイルのやりやすさは goreleaser-action のある Go に軍配が上がるように感じたので、
CLIツールを作るときは今後も基本は Go を使いそうです。

GitHub Actions で Rust のクロスコンパイルをしている例:

ありがとうReddit

実装でどうしてもわからないところがあり、
Reddit の Go コミュニティーで質問してみたらすぐに回答があり驚きました。

https://www.reddit.com/r/golang/comments/15w4ibl/is_it_possible_to_make_less_or_git_log_command/
これが Reddit の初投稿となりました。

おかげで最初のバージョンよりもわかりやすい git log の表示が可能となりました。
返信をくださった方々、ありがとうございました。