いままで git rebase -i に何度泣かされたことでしょう。
git は最高のツールですが(他の SCM に勝るという意味ではありません)、あれは非常に出来がわるい。
テストを回すたびに自動コミットする continuous commit のプラクティスを採用している私達にとって、 interactive rebase は頭痛の種でした。 (continuous commit については Continuous Commit (kyon_mm さんの発表資料)、最近の git の使い方について - tomykaira makes love with codes など)。
git-rebase--interactive.sh を自分なりに書きかえたり(Specify rebase comment in git-rebase-todo instantly)、
Emacs の拡張で git-rebase-mode を作ったりしましたが、いっこうによくならない。
問題はテキストベースのために得られる情報量がすくないこと、一発で歴史をつくりかえなければいけないこと、コンフリクトしたときにやりなおしができないことなどにあります。
Uchronie
そこで、 GUI ベースで interactive rebase を安全におこなうツール、 Uchronie を作成しました。 Uchronie とはフランス語で歴史改変という意味だそうです。史上もっともすぐれた歴史改変ツールにふさわしい名です。
ConstraintScala をつかって Scala で作っています。 Git の操作には JGit を利用しているので、 git コマンドには一切依存しません。 Windows でも動作するはずです(動作しなかったら報告してください)。
目的
- continuous commit 愛好者を支援すること
- git でつむがれる歴史を綺麗にすること
- パッチベースのレビューを容易にすること
Uchronie はすべての git 利用者に役に立つと確信しています。
インタフェースがとっつきにくく敬遠されがちだった git の interactive rebase よりずっと効率的です。
git の仕組みを完全に把握していなくても、ツールのガイドで使えるので、初級者にもおすすめです。
一連のパッチのなかのコミットで、おなじ箇所を何度も変更していると分かりにくい場合があります。 Uchronie なら歴史を確認しながら修正できるので、一発で分かりやすいように書き直せます。
git rebase -i をいままで愛用していた人も、上位互換の機能を提供している(はず)なので、違和感なく移行でき、すぐ快適だと分かるでしょう。
ダウンロード
共有フォルダで executable jar を公開しています。
https://www.dropbox.com/s/u8p85kvjpv2y7to/Uchronie.jar
ConstraintScala とおなじリポジトリで全コードを公開しています。
sbt のプロジェクトを分けているので、 project uchronie してから assembly すると jar が生成されます。
実行
java -jar Uchronie.jar リポジトリのフルパス 開始コミット 終了コミット
リポジトリパスはフルパスで指定します。これは JGit のバグのためです(修正パッチは送信ずみ)。
Unix 系の場合 readlink -f . とするといいです。
開始コミットと終了コミットは一般的な ref で指定できます(SHA-1、ブランチ名、タグなど)。
通常は開始コミットを origin/hoge や master にして、終了コミットを HEAD や今のブランチ名にすると思います。
開始後、すぐに作業用ブランチを作成し、実行中はその上で作業します。 突然終了した場合は、元のブランチに戻せば元の状態になります。 アプリケーション終了時に最後に安全に書き換えが終了したポイントに、開始時のブランチを移動します。 終了時はそのまま push したり、開発を継続したりできる状態です。
Issue
まだ十分に使い込めていないので、エッジケースでバグがあるかもしれません。 私の使い方に特化しているので、使いにくい部分があるかもしれません。
もし発見しましたら、 Github issue に報告していただけると助かります。
Issues · tomykaira/constraintscala
Pull request はもちろん大歓迎です。
continuous commit ともども、よろしくおねがいします!