世界を動かす技術を、日本語で。

jjとは何か、そしてなぜ気にするべきなのか?

概要

  • Jujutsu(jj) は、分散型バージョン管理システム(DVCS)の一種
  • git 利用経験者向けに設計された、より単純かつ強力なツール
  • gitMercurial の長所を統合し、操作性とパワーを両立
  • git互換バックエンド により既存プロジェクトとの共存が可能
  • 導入リスクが低く、いつでも git へ戻せる柔軟性

Jujutsu(jj)とは何か

  • jj は、JujutsuのCLI(コマンドラインインターフェース)名称
  • 分散型バージョン管理システム(DVCS) として設計
  • gitやMercurial(hg) など他のDVCSの長所を取り入れた構造
  • 操作の容易さ高機能性 を両立した設計思想
  • 本質的なコマンド数の削減各コマンドの強化 が特徴

jjのメリットと特徴

  • gitより簡単かつ強力 という稀有な特徴
  • 機能と複雑さのトレードオフ を打破した設計
  • 連携のしやすさ により、コマンド同士の相互作用が向上
  • 高度な使い方 でgitでは困難な操作も可能
  • git互換バックエンド により、既存のワークフローを損なわない

導入のしやすさとリスクの少なさ

  • 他のユーザーがjjへ移行する必要なし
  • jjで作業した履歴もgitに戻せる 互換性
  • 試しやすく、失敗しても元に戻せる 安心感
  • 既存プロジェクトへの影響が最小限 で済む柔軟性

まとめ

  • jjはgitユーザーにとって魅力的な新世代DVCS
  • シンプルさとパワフルさを両立
  • 導入リスクが低いので気軽に試せる選択肢

Hackerたちの意見

最後の段落が一番大事かもね。 > 「jjを試してみるべき理由がもう一つあるんだ。それは、gitと互換性のあるバックエンドを持っているから、他の人に変換を強要することなく、自分だけでjjを使えるってこと。だから、試してみるデメリットは本当にないよ。もし合わなかったら、書いた履歴を全部失うわけじゃないし、問題なくgitに戻れるから。」

面白いことに、俺もCVSやSubversionでgitをそんな風に使ってたよ。

でも、それは違うよ。互換性はあるけど、スムーズではない。そういう機能は主に移行のユースケースや、jjで管理されているリポからのgitデプロイメントをサポートしてるだけ。gitがやる操作は、jjのログには載ってないから、常にインポートしなきゃいけないんだ。プロジェクトは単一の主要インターフェースを推奨してるよ。

大事な注意点:GitとJJを同じディレクトリで使おうとしない方がいいよ。JJだけを使うなら多分大丈夫だけど、混ぜるとひどいことになるから。

LFS、サブモジュール、またはフックを使ってない限りね。

jjを試してるんだけど、嫌なところが一つあって、ファイルの編集が自動でコミットされちゃうんだよね。だから、変更のために空の新しいコミットを作らなきゃいけない。例えば、2週間前のコミットからリポジトリを見たいとき、ただそのコミットをチェックアウトしてファイルを編集すると、そのコミットが自動で変更されちゃって、その後のすべてが新しい変更の上にリベースされるんだ。だから、古いコミットから新しいブランチを作って、そのブランチに空のコミットを追加して、ファイルの変更が過去2週間の履歴を書き換えないようにしてる。gitは、ファイルに何をしても、自分が指示するまで リポジトリが変わらないから、ずっといいよね。

だから、editは絶対使わないで、代わりにnewを使った方がいいよ。そうすれば、変更が追跡されて、ゴチャゴチャにならないから。gitでスタッシュを jugglingするより、ずっといいと思う。

うわ、それは完全に無理だわ。gitを使うのは複雑なメンタルモデルが必要だけど、少なくとも自分が頼んだこと以外は何もしないからね。

jj newは、空のリビジョンを上に作ることで、git checkoutに似てる。逆にjj editは、git checkout; [編集...]; git add -A; git commit --amend --no-editに似てるね。

最近、新しいファイルの自動ステージングを無効にできるようになったから、これでメインの不満が解消されたよ。

jj editは、他のコメントでも言われてる通り、最大の罠だと思う。だから、jj newを使った方がいいよ。でも、もしうっかり編集したり変更したりしても、jj undoが意外とよく効くんだ。jjを使ってるときは、コミットを考えずに(jjはそれを非常に安価な「スナップショット」として扱う)「変更」に集中した方がうまくいった。最初は変な感じだったけど、gitでリベースしてるときに、自分がした論理的な変更をそう見てたことに気づいた。jjはそれを明示的にしてくれる。jjの自動リベースは、変更をプッシュするまで関係ないし、一度プッシュするとそれが不変になるから、共有された変更をうっかりリベースするのを防いでくれる。

これはまさにjjの存在理由だから、もし自分には合わないと決めても驚かないよ。

Hacker Newsで議論の続きを見る