🎓

IntelliJでGitのautosquashを使う

に公開

SquashとFixup

GitにはSquashという機能があり、コミットをまとめることが可能です。ツリーを綺麗にしたり、実験的な実装を積んでおき、最後にまとめる等に使える便利機能です。
また、Fixupというものがあり、これは修正したいコミットに対してコミットを積むことが可能です。

fixup!コミットを作成しておくことで、後で対話的リベース(Interactive Rebase)を実行した際に、修正対象のコミットへ自動的に取り込ませる(Squashする)ことができます。

本来ならSquashは手作業で対象コミットを選ぶ必要があるのですが、Auto Squashを使うとFixupコミットが対象のコミットに自動で紐付けられます。

結論

Auto SquashをIntelliJで使う方法です。

git config rebase.autosquash true
このGitの設定コマンドでIntelliJのInteractively Rebase from Here...でほぼ自動でSquashされるようになります。

context menu interactively rebase from here.png
コンテキストメニューのinteractively rebase from here...

dialog interactively rebase from here.png
Fixup指定した際のコミットツリー

解説

IntelliJではGitのFixupを行うコマンドはあるのですが、Fixupをまとめる専用コマンドは用意されていません。まとめる場合はSquashコマンドを使います。

FixupはGitのツリーウィンドウ上でコンテキストメニューにある Fixup... から行います。
この際、ツリーウィンドウ上で選ぶコミットは、fixupしたときに入るコミットです。

context menu fixup

https://pleiades.io/help/idea/edit-project-history.html#amend-any-commit

このFixupを自動でまとめるためのGitコマンドはgit rebase --autosquashとなります。
autosquash設定していない場合、Fixupコミットは親のコミットに紐付かないでフラットな状態で表示されます。
その場合、自分でコミット先を変更可能です(autosquash設定時でも手動で変更は可能)

対話型リベースを実行してプロジェクト履歴を編集する

つまりIntelliJにはこのコマンドに対応するメニューなどからのコマンドが用意されていません。
唯一あるのは Interactively Rebase from Here... です。
これは対話型リベースを行うためのダイアログを使ってRebaseを行える機能です。
rebase.autosquashの設定をせずに起動するとローカルのFixupの紐付けは無視され、フラットなログが表示されます。
これではFixupが意味を成しません。

JetBrainsのYouTrack上ではこの挙動を直してほしいと要望は出ているようです。
しかしこの挙動は「Gitの設定に依存しているため、設定を変更すれば対話型でほぼ自動でFixupの紐付けが行われる」旨をJetBrainsのサポートが返していました。

https://youtrack.jetbrains.com/issue/IDEA-209497/Interactive-rebase-does-not-respect-fixup-and-squash-commits-out-of-the-box.#focus=Comments-27-4546151.0-0

というわけで、冒頭で紹介したrebase.autosquashを有効にすることでIntelliJのUI上でFixupからautosquashまでスムーズに完結できるようになります。

以上。

Discussion