jj 導入のメリット整理
jj は Git のコマンドを便利にラップしたツールではなく、独立した VCS として動作するバージョン管理ツールです。
jj を利用すると、普段の Git 運用で発生しがちな履歴整理の負担を大きく減らすことができます。
ここでは、実際の開発現場でよく発生する問題を例にしながら、jj を導入するメリットを整理します。
commit のサンドイッチ問題
Section titled “commit のサンドイッチ問題”Git を使って日常的に開発をしていると、次のように変更が混ざってしまう状況はよく発生します。
A の修正をする↓B の修正をする↓A の修正漏れに気づいて対応する結果として、commit 履歴は次のようになります。
A 修正B 修正A 修正しかし、Pull Request を出す段階になると、本当は次のように整理したくなります。
A 修正B 修正この「変更が混ざってしまう問題」は日常的に発生します。
rebase 地獄の正体
Section titled “rebase 地獄の正体”この状態を整理するために、多くの場合 interactive rebase を使います。
しかし実際には、
- commit の順番を入れ替える
- fixup / squash を行う
- conflict を解消する
- 履歴を壊さないように注意する
といった作業が必要になります。
そして途中で失敗すると、
「今どこに戻ればいいのか分からない」
という状態になります。
これが、いわゆる「rebase 地獄」の正体です。
jj のアプローチ
Section titled “jj のアプローチ”jj は、この問題を別の発想で解決します。
Git の場合、作業を進めながら commit を積み重ねていくため、あとから履歴を整理しようとすると rebase や squash が必要になります。その結果、「履歴を壊さないように慎重に操作する」という負担が発生します。
そのため実際には、最初からきれいに commit を作ることを常に意識する必要があります。
一方、jj は別のアプローチを取ります。
作業中は commit をどんどん増やしていくのではなく、「いま作業している変更内容」を 1 つの commit に更新し続けるイメージになります。
Git でたとえるなら、1 つの commit に対して soft reset と修正を繰り返し、最後に意味のある単位で commit を切り直す感覚に近いです。
その結果、作業中の流れが
A 修正B 修正A 修正のように混ざっていても、あとから
A & B 修正 commit↓ splitA 修正 commitB 修正 commitという形で整理できます。
つまり、作業順序を気にせず進め、最後に意味単位で commit を分割するという運用が自然にできるようになります。
作業順序に縛られなくなるのが最大のメリットです。
履歴整理で失敗しても戻れる
Section titled “履歴整理で失敗しても戻れる”さらに jj には operation log があり、
履歴整理の途中状態そのもの
に戻ることができます。
Git のように「どの commit に戻すか」を考える必要がなく、
作業工程を巻き戻す
感覚で undo が可能です。
これにより、履歴整理に対する心理的ハードルがかなり下がります。
Git を捨てる必要はない
Section titled “Git を捨てる必要はない”重要なのは、jj は Git を置き換えるものではないという点です。
jj は独立した VCS として動作し、
jj で履歴整理を行う↓最終結果が Git commit に反映されるという形で Git と共存できます。
そのため、
- GitHub
- CI
- チームの既存 workflow
を変更せずに導入できます。
実際どう操作するのか
Section titled “実際どう操作するのか”基本的な流れは次の通りです。
既存の Git リポジトリで利用する場合:
git clone ...↓cd repo↓jj git initその後の基本的な作業フロー:
編集する↓jj status / jj log で状態確認↓jj commit↓変更が混ざったら jj split↓失敗したら jj undo基本的な流れは以上です。
jj のメリットは一言で言うと、
作業は自由に行い、履歴は最後に整理できる
点にあります。