【jj】Jujutsu入門 - Git互換の次世代バージョン管理システム
jj(Jujutsu)は、Git互換の次世代バージョン管理システムです。Gitの複雑さを解消しつつ、強力な履歴編集機能を提供します。この記事では、jjの基本概念からGitとの違い、実践的なワークフローまで解説します。
jjとは
jj(Jujutsu)は、Googleのエンジニアが開発したバージョン管理システムです。Gitリポジトリをそのまま使用でき、既存のGitワークフローと共存できます。
主な特徴
- ステージング(git add)が不要
- 作業コピーが自動的にコミット扱い
- 操作ログで取り消し可能(undo機能)
- 競合したままコミットできる(遅延解決)
- 子孫コミットの自動リベース
- Gitリポジトリと完全互換
インストール
macOS
brew install jj
Windows
winget install jj
# または
scoop install jj
Linux
# Debian/Ubuntu
sudo apt install jj
# Arch
sudo pacman -S jujutsu
基本的な使い方
既存のGitリポジトリでjjを使う
cd your-git-repo
jj git init --git-repo .
これだけで、既存のGitリポジトリをjjで操作できるようになります。
状態確認
jj status # 現在の状態を表示
jj log # コミット履歴を表示
GitとjjのコマンドA対応
Gitユーザーが最も気になるのは、普段使っているコマンドがjjでどうなるかでしょう。
git add → 不要
jjでは git add に相当するコマンドは不要です。作業コピーの変更は、jjコマンド実行時に自動的にスナップショットとして記録されます。
# Git
git add .
git commit -m "feat: add new feature"
# jj
jj commit -m "feat: add new feature"
コマンド対応表
| Git | jj | 備考 |
|---|---|---|
git add . | 不要 | 自動追跡 |
git commit -m "msg" | jj commit -m "msg" | |
git push | jj git push | |
git pull | jj git fetch | |
git status | jj status | |
git log | jj log | |
git diff | jj diff | |
git stash | 不要 | 常にコミット状態 |
git checkout -b | jj new + jj bookmark create |
作業コピーの仕組み
スナップショットのタイミング
jjでは、ファイルを保存しただけでは何も起きません。jjコマンドを実行したタイミングでスナップショットが取られます。
ファイル編集 → 保存 → (まだ何も起きない)→ jjコマンド実行 → スナップショット取得
watchmanを設定すると、ファイル変更時に自動でスナップショットを取ることも可能です。
「とりあえずコミット、整理は後で」
jjの最大のメリットは、コミットメッセージを後から付けられることです。
# 作業開始(空のコミットを作成)
jj new
# 作業中...
# ファイルを編集
# 後からメッセージを付ける
jj describe -m "feat: add new feature"
ブランチ(Bookmark)の操作
jjでは、ブランチを「Bookmark」と呼びます。
ブランチの作成
# mainから新しいブランチを切る
jj new main
jj bookmark create feature-a -r @
ブランチからブランチを切る
# feature-aから新しいブランチを切る
jj new feature-a
jj bookmark create feature-b -r @
Gitと異なり、jjのブックマークは自動で移動しません。コミット後に明示的に移動する必要があります。
jj commit -m "feat: add something"
jj bookmark set feature-a -r @- # 明示的にブックマークを移動
リモートへのプッシュ
基本的なプッシュ
jj git push
新規ブランチのプッシュ
jj new main
jj commit -m "feat: new feature"
jj git push -c @- # 新しいブックマークを作成してプッシュ
競合の解決
jjの競合マーカー
jjの競合マーカーは、Gitとは異なる形式です。
<<<<<<<
%%%%%%%
-grape
+grapefruit
+++++++
APPLE
GRAPE
ORANGE
>>>>>>>
%%%%%%%: 差分(何が変更されたか)+++++++: 元の状態(スナップショット)
競合したままコミットできる
jjの最大の特徴の一つは、競合したままコミットできることです。解決は後から行えます。
競合解決の方法
# 1. 直接ファイルを編集して解決
# 2. マージツールを使用
jj resolve
# 3. どちらかを採用
jj resolve --tool :ours # 自分の変更を採用
jj resolve --tool :theirs # 相手の変更を採用
履歴編集
jjでは、履歴編集が非常に簡単です。
過去のコミットを編集
jj edit <commit-id>
# ファイルを編集
jj squash # または jj new で新しいコミットへ
子孫のコミットは自動的にリベースされます。
コミットの分割
jj split
インタラクティブに、1つのコミットを複数に分割できます。
差分エディタで編集
jj diffedit
差分をエディタで直接編集できます。
VSCode拡張機能
jjをVSCodeで使うための拡張機能があります。
VisualJJ(おすすめ)
- コミットツリーの可視化
- ドラッグ&ドロップでリベース
- クローズドソース(無料)
ID: visualjj.visualjj
Jujutsu Kaizen (jjk)
- オープンソース
- Source Controlビューでjj操作
ID: jjk.jjk
OPEN JJ
- 軽量なjj統合
ID: olup.open-jj
まずはVisualJJを試してみてください。オープンソースが好みならjjkがおすすめです。
GitからjjへのA移行
既存のGitリポジトリで使い始める
cd your-git-repo
jj git init --git-repo .
これだけで、既存のGitリポジトリをjjで操作できます。チームメンバーは引き続きGitを使い続けることも可能です。
Gitとの共存
jjはGitリポジトリを直接操作するため、以下のワークフローが可能です。
- 自分はjjを使う
- チームメンバーはGitを使う
- リモートは通常のGitリポジトリ
参考文献
まとめ
jj(Jujutsu)は、Gitの複雑さを解消しつつ、強力な機能を提供するバージョン管理システムです。
- git addが不要で、作業が楽になる
- コミットメッセージを後から付けられる
- stashが不要(常にコミット状態)
- 履歴編集が簡単(自動リベース)
- 競合を後から解決できる
- Gitリポジトリと完全互換
Gitに慣れている方でも、jjの「とりあえずコミット、整理は後で」というワークフローを体験すると、その便利さに気づくはずです。既存のGitリポジトリでそのまま試せるので、ぜひ使ってみてください。