🥙

[Git] エディタを開かずに変更中の内容を特定のコミットに統合する

に公開

以下のエイリアスを登録しておくと git cmfr COMMIT_HASHで現在の変更内容を指定したコミットに統合できる。

[alias]
	cmfr = "!f() { git commit --fixup \"$1\"; GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash \"$1\"^; }; f"

仕組み

変更中の内容を特定のコミットに統合するには、以下の手順を踏む必要がある。

  1. 現在の変更をコミット
  2. rebaseをインタラクティブモードで実行する
  3. 統合元のコミットを統合先のコミットの次の行まで移動
  4. 統合元のコミットのコマンドをfixupに変更
  5. エディタを保存して終了

やりたいことに対して手順が多すぎるので色々調べてみたら、rebaseにはautosquashというオプションがあるらしい。
これを使うと

> git commit --fixup COMMIT_HASH
> git rebase -i --autosquash COMMIT_HASH^

と実行するだけでさっきの手順の4番の状態にしてくれる。あとはエディタを閉じるだけでOK。

ここまできたらエディタを閉じるところも省略したい。ということで調べてみたら環境変数GIT_SEQUENCE_EDITOR:(何もしないコマンド)を指定すると即座に保存&終了できるそう。

> git commit --fixup COMMIT_HASH
> GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash COMMIT_HASH^

これでエディタを開くことなく指定したコミットに統合できる。

入力文字数が多いのでエイリアスとして登録しておく。

[alias]
	cmfr = "!f() { git commit --fixup \"$1\"; GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash \"$1\"^; }; f"

参考

Discussion