happiness (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) happiness

gitのdiffをcommitIDを指定して比較するコマンド(仕様・技術選定理由付き)

動機

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 ^ し)