🧭

Git worktreeからjjへ: 変更の扱いを変えてハッピーになる

に公開

はじめに

Git worktreeは、並行作業の摩擦を減らすための強い手段だ。けれど、作業が増えるほど「分ける」こと自体が疲労になる。jjはその疲労を別の構造で受け止める。

この記事は、Git worktreeを使ってきた人が、jjとの違い移行の考え方を理解し、無理なくハッピーに移れるように書く。

jjは「変更」を中心に据える

Gitはコミットが中心だ。変更はコミットに吸い上げられ、そこで初めて意味づけされる。だから、分割や修正は「コミットを整える作業」になりやすい。

jjは逆向きだ。変更が先に存在し、後から意味づけ(describe)する。この順序の違いが、作業の心理的コストを変える。

Gitとの違いを短く整理する

ステージングの感覚が変わる

Gitではステージングが「編集とコミットの間の関所」になる。jjでは、変更は最初から並列に存在するので、その関所が前面に出てこない。代わりに、jj splitで「いま分ける」を自然に行える。

「整える」のタイミングが後ろに移動する

Gitでは、コミットをきれいにするために早めの分割やrebaseを意識する。jjでは、変更が蓄積してからでも分けられるので、整える作業が後ろに寄る

変更の意図が残りやすい

jj describe -m "..."は、変更に意味を与える行為そのものだ。修正後に意図を残すより、意図を残すことが修正の一部になる

Git worktreeとの違い

結論だけ先に言うと、Git worktreeは「環境を分ける」手段で、jjは「変更を分ける」手段だ。

  • worktreeは、複数ブランチを物理的に分けて同時に触る
  • jjは、1つの作業場所で変更を並列に扱う

まだworktreeが有効な場面

jjに移行しても、以下のケースではworktreeが合理的だ。

  • 依存関係のバージョンが作業ごとに大きく違う
  • ビルド成果物がディレクトリに強く結びついている
  • 大きなデータや長いビルドがキャッシュ前提

逆に言えば、論理的な並行作業が目的なら、jjのほうが軽い。

移行の考え方: 手順よりも順序

移行は「いきなり全部置き換える」より、順序を変えるところから始めると楽になる。

1. まずは観察系コマンドだけ使う

作業の途中で以下だけ実行する。これだけで「変更の見え方」が変わる。

jj status
jj diff
jj log -r @ -n 5

2. 変更の分割を後ろに置く

一度まとめて変更を作ってから、必要になった時点で分ける。

jj split

この「後から分けても間に合う」感覚が、jjの強さだ。

3. 意図を残すタイミングを変える

作業が一段落したときに、意図を記録する。

jj describe -m "Explain why this change exists"

4. PRはブックマーク中心で流す

OpenCode前提なら、以下の流れが最短だ。

jj bookmark create -r @ pr/jj-migration
jj git push --bookmark pr/jj-migration
gh pr create --head pr/jj-migration --base main

OpenCodeとjjの相性

OpenCodeは「安全な作業単位」と「明示的な操作」を好む。jjのモデルはそれと一致している。

  • 変更が常に見えるので、作業範囲が明確になる
  • splitdescribeで、意図と変更の境界を保てる
  • PR対象の切り出しがやりやすい

結果として、作業が一本道にならず、戻りやすい

どうしたらハッピーになれるか

ハッピーの条件は「操作が減ること」ではなく「不安が減ること」だと思う。

  • 分割の遅れが怖くない
  • 履歴の整形が義務にならない
  • 変更の意図が後からでも掴める

jjは、これらを構造で支える。だから、運用の努力を減らしても破綻しにくい。

まとめ

Git worktreeは「環境を分ける」ことで並行作業の負荷を下げる。jjは「変更を分ける」ことで思考の負荷を下げる。移行は機能比較ではなく、作業の順序を変えることから始めるといい。

最初は観察だけでも十分だ。小さく使い始めて、戻りやすさを体験できれば、自然とハッピーに近づく。

GitHubで編集を提案

Discussion