ちなみに

火曜日の空は僕を押しつぶした。

tigでfixupを簡単にする

2つ以上前のコミットを修正したいときに --fixup を使うのは近年ではよく知られている。

$ git commit --fixup <commit>
$ git -i --autosquash <commit>~ # rebase.autosquash = true にしておけばオプションは不要

しかし、この方法だと毎回 $EDITOR が開いてしまいちょっと面倒である。

これを回避する方法は GIT_SEQUENCE_EDITOR 環境変数を使う方法で GIT_SEQUENCE_EDITOR=true などとしておくと、エディタを開かずに rebase が完了する。

また git 2.44 以降は --interactive じゃなくても --autosquash が可能になったためさらに簡単になった (GitHubのブログが詳しい)

これを使うと以下のような alias を定義することができる。

fixup = "!f() { git commit --fixup \"$1\"; git rebase --autosquash --autostash \"$1\"~; }; f"

--autostash は自動で stash してくれるオプションで、他の変更があるときに先に fixup したいときにべんり。 残念ながら rebase.autosquash は interactive mode にしか有効でないので、オプションの指定は必須。

ここまでくると目的のファイルを stage に index しておいて、git fixup <commit> とするだけでコミットの修正が完了するようになる。

しかし、この commit hash をコピペするのも面倒になってきたので、今回 tig の設定に以下のような bind を追加した。

bind main F @git fixup %(commit)
bind log F @git fixup %(commit)
bind diff F @git fixup %(commit)

これで tig の main view などで目的のコミットにカーソルを合わせて F って押すだけになってめちゃくちゃ楽になった。