コンテンツにスキップ

jj 導入のメリット整理

jj は Git のコマンドを便利にラップしたツールではなく、独立した VCS として動作するバージョン管理ツールです。

jj を利用すると、普段の Git 運用で発生しがちな履歴整理の負担を大きく減らすことができます。

ここでは、実際の開発現場でよく発生する問題を例にしながら、jj を導入するメリットを整理します。

Git を使って日常的に開発をしていると、次のように変更が混ざってしまう状況はよく発生します。

A の修正をする
B の修正をする
A の修正漏れに気づいて対応する

結果として、commit 履歴は次のようになります。

A 修正
B 修正
A 修正

しかし、Pull Request を出す段階になると、本当は次のように整理したくなります。

A 修正
B 修正

この「変更が混ざってしまう問題」は日常的に発生します。

この状態を整理するために、多くの場合 interactive rebase を使います。

しかし実際には、

  • commit の順番を入れ替える
  • fixup / squash を行う
  • conflict を解消する
  • 履歴を壊さないように注意する

といった作業が必要になります。

そして途中で失敗すると、
「今どこに戻ればいいのか分からない」
という状態になります。

これが、いわゆる「rebase 地獄」の正体です。

jj は、この問題を別の発想で解決します。

Git の場合、作業を進めながら commit を積み重ねていくため、あとから履歴を整理しようとすると rebase や squash が必要になります。その結果、「履歴を壊さないように慎重に操作する」という負担が発生します。

そのため実際には、最初からきれいに commit を作ることを常に意識する必要があります。

一方、jj は別のアプローチを取ります。

作業中は commit をどんどん増やしていくのではなく、「いま作業している変更内容」を 1 つの commit に更新し続けるイメージになります。

Git でたとえるなら、1 つの commit に対して soft reset と修正を繰り返し、最後に意味のある単位で commit を切り直す感覚に近いです。

その結果、作業中の流れが

A 修正
B 修正
A 修正

のように混ざっていても、あとから

A & B 修正 commit
↓ split
A 修正 commit
B 修正 commit

という形で整理できます。

つまり、作業順序を気にせず進め、最後に意味単位で commit を分割するという運用が自然にできるようになります。

作業順序に縛られなくなるのが最大のメリットです。

さらに jj には operation log があり、
履歴整理の途中状態そのもの
に戻ることができます。

Git のように「どの commit に戻すか」を考える必要がなく、
作業工程を巻き戻す
感覚で undo が可能です。

これにより、履歴整理に対する心理的ハードルがかなり下がります。

重要なのは、jj は Git を置き換えるものではないという点です。

jj は独立した VCS として動作し、

jj で履歴整理を行う
最終結果が Git commit に反映される

という形で Git と共存できます。

そのため、

  • GitHub
  • CI
  • チームの既存 workflow

を変更せずに導入できます。

基本的な流れは次の通りです。

既存の Git リポジトリで利用する場合:

git clone ...
cd repo
jj git init

その後の基本的な作業フロー:

編集する
jj status / jj log で状態確認
jj commit
変更が混ざったら jj split
失敗したら jj undo

基本的な流れは以上です。

jj のメリットは一言で言うと、
作業は自由に行い、履歴は最後に整理できる
点にあります。