動機
git diff <commit ID1>..<commit iD2>
がしたい時がある。
しかし、わざわざgit log
して確認した上で選択するのがめんどくさい。
よしコマンド化しよう。
仕様(ユースケース)
- ユーザーは、
sdf
コマンドをコマンドラインに入力する- (※sdfはselectable diffの略)
- システムは直近n件のcommitメッセージを表示する
- 上からcommitが新しい順に並べる
- ユーザーは、commit message を n 件選ぶ
- 1件の場合: 直前のcommitとのdiffを取る
- 2件の場合: 対象のcommit間のdiffをとる
- 古いcommitの変更後~新しいcommitでの変更を差分とする
- 3件以上の場合: エラーにするかなぁ→本来なら2つ選んだ瞬間に即実行されたらいいのかも???: 現段階では使わないケースなので気にしない
実装と技術選定と懸念
- ruby + fzfを採用
- rubyは普段使っている可読性が高いため
- 毎回shellscriptで書いていたが、毎回検索し直さないといけない上に、検索性能が低い
- また、方言も多いので、最近は微妙に感じるため
rubyにする懸念
- shellscriptの実行より、0.数秒遅いかもしれん
許容d(^ x ^ し)
見積もり・工程
0.5h以内程度
コード
#!/usr/bin/env ruby selected_commits = `git log --pretty=oneline -n 30 | fzf -m --layout=reverse` commit_ids = selected_commits.split("\n").map do |commit| commit.split(' ').first end cmd= "git diff #{commit_ids.first}..#{commit_ids.last}" exec cmd # ruby インタプリタを置き換える
chmod a+x sdf
で実行権限付与すれば完了
使い心地
想定通りd(^ x ^ し)