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
って押すだけになってめちゃくちゃ楽になった。