Spinach Forest

Jujitsu

ここしばらく仕事で Jujitsu (JJ) という VCS を使っている。

JJ は Google が開発している新しいオープンソースの VCS. バックエンドが交換可能なので Git repo をいじるのにも使えるし、プロプリエタリな VCS もインテグレートできる。自分が使っているのは後者である。つまり Google monorepo のフロントエンドとして使っている。

割と気に入っており、もう従来の Mercurial に戻る気はない。(Mercurial も pluggable backend に対応しており、Google は monorepo をバックエンドとした魔改造 Mercurial を使っていた。というか今も使っている。) Git のフロントエンドに使うとどのくらい便利なのかは知らないが、自分の用途には良い。

自分が仕事でやっているワークフローに JJ はよく合っている。どういうワークフローかというと:

雰囲気としては、まずババーっと 2-3 のコミットを重ねてやりがいことができるか確認する。それができたら、コミットを一個ずつコードレビューに送っていく(レビュアは先のコミットを見ることもできる)。レビューを待ちながら重ねたコミットを直したり、新しいコミットを書いたりする。レビューを受けて積んだコミットを直す。レビューが LG されたらそのコミットを submit し、残りのコミットを HEAD に rebase し、以下繰り返し。こういう submit 前ブランチが複数ある。

jj edit

「コードレビューを受けて直す」という flow で威力を発揮するコマンドが jj edit. このコマンドで編集したいコミットのリビジョンを指定すると、そのあとのコードの編集が自動的にそのリビジョンに直接反映される。git commit とかしなくていい。これだけ聞くと意味がわからないかもしれないが、イメージとしては背後で jj のデーモンがチェックアウトのファイル編集を見張っていて、変更があったらコミットをアップデートしていく。

コードを mess up したら困るんじゃね?という心配はあるがしかし: 1) 現実にコードレビューの反映で mess up することは少ない。 2) mess up しそうな時はだいたい事前にわかるので、そういう時は jj edit ではなく jj new という別のコマンドを使う 3) mess up した時にも、事前のスナップショットに戻すコマンドはある。

いちいちコミットしなくていい事実に最初は正気を疑ったが、慣れると快適すぎてもはや never look back となった。

jj edit のもう一つ興味深いところは、編集後も子のコミットがそのまま子にぶらさがっていること。 r1 -> r2 -> r3 とコミットしたあと r1 を 編集しても、r2 と r3 は引き続き子のままである。rebase しなくていい。

First class conflict

でも r1 への編集が r2 とコンフリクトしたらどうすんの?という疑問がある。答えは「どうもしない」である。

JJ はコンフリクトが first class citizen である。Git や Mercurial では、rebase したコミットの conflict はなんとかして解決するか、ダメなら abort しないといけない。一方で jj のコミットは、コンフリクトしてもそのままコミットとして存在しつづけている。ただし「コンフリクトしてるよ」とマークされ、そのコミットをチェックアウト (jj edit) すると conflict marker のついたファイルが現れる。そしてコンフリクトを直しマーカを消すと、自動的にコンフリクトステータスも解消される。

これは、便利。コードレビューの結果をうけ r1 をガチャガチャいじった結果 r2 がコンフリクトすることはよくある。その r1 をコミットしたあと rebase しないでおくと r2 以下の存在を忘れたりしがちだし、一方で rebase するとコンフリクトの解決という認知負荷の高い作業をすぐにやらないといけない。JJ はコンフリクトした子を見失うことなく、しかし解決を後回しにできるので目先のレビュー対応に集中できる。ちょー便利。


他にも色々おもしろコマンドがあるが、まだ使いこなしているとはいえないので割愛する。コマンドの種類だけでなく diff とか log とかの表示も、後発だけあって洗練されている。

今すぐ使わないと missing out する、という感じではないが、新しいパラダイムを試すのは面白い体験なので、未だにエーアイに任せず手でコード書いてる原始人同志におかれましては試して頂けるといいのではないでしょうか。こういうパズル遊びは手書き固有の楽しみだと思うので。