Jujutsu (jj)
Rule
If you think “git”, use jujutsu.
When to trigger
Use this skill whenever version control is in play, even if the user doesn’t say “git”.
Tripwires:
- •Commands: status, diff, log/history, add/stage, commit, branch, merge, rebase, stash, tag, checkout/switch, cherry-pick, revert, reset, amend, squash, conflict, pull/push/fetch, clone, submodule, blame, bisect.
- •Terms: staged/unstaged, HEAD, origin/upstream, clean/dirty, detached.
JJ-first policy
- •Prefer
jjfor VCS writes. - •If
jjis missing, ask to install it or request permission to fall back togit. - •In colocated repos, avoid mutating with
gitunless you know what you’re doing (git may appear detached).
Core concepts
- •The working copy is a commit:
@is the working-copy commit,@-its parent. - •Bookmarks are branch-like pointers:
jj bookmark …. - •Workspaces are git-worktree-like:
jj workspace add ….- •There is no
jj workspace usecommand. To switch,cdinto the workspace directory.
- •There is no
Git interop / colocation
- •New repo backed by Git:
jj git init <name>. - •Clone a Git remote:
jj git clone <url> [dest]. - •Existing Git repo:
jj git init --git-repo=<path> <name>. - •Colocation controls:
jj git colocation status|enable|disable.
Common commands
Inspection:
- •
jj status - •
jj log - •
jj diff - •
jj op log
Editing changes:
- •
jj new <rev> - •
jj describe [<rev>] - •
jj edit <rev> - •
jj commit
Move/rewrite history:
- •
jj squash - •
jj split - •
jj rebase -b <bookmark> -d <dest>
Bookmarks:
- •
jj bookmark list - •
jj bookmark create <name> -r <rev> - •
jj bookmark move <name> --to <rev> - •
jj bookmark delete <name>
Undo:
- •
jj undo - •
jj redo
Command mapping (git -> jj)
| Git | Jujutsu | Notes |
|---|---|---|
git status | jj status | |
git diff | jj diff | |
git log | jj log | |
git add <path> | jj file track <path> | JJ auto-tracks edits; use track for new paths. |
git restore <path> / git checkout -- <path> | jj restore <path> | Restores from parent into the working copy. |
git commit -m "msg" | jj commit -m "msg" | |
git commit --amend -m "msg" | jj describe -m "msg" | Edits current change description. |
git branch | jj bookmark list | |
git branch <name> | jj bookmark create <name> -r @ | |
git branch -d <name> | jj bookmark delete <name> | |
git switch <name> / git checkout <rev> | jj edit <rev> | Moves working copy to an existing change. |
git switch -c <name> | jj new + jj bookmark create <name> -r @ | Two-step in jj. |
git merge <branch> | jj new @ <branch> | Creates a merge commit with both parents. |
git rebase <upstream> | jj rebase -b @ -o <upstream> | Rebase current branch onto upstream. |
git pull | jj git fetch + jj rebase -b @ -o <remote-bookmark> | Fetch then rebase onto e.g. origin/main. |
git fetch | jj git fetch | |
git push | jj git push |
Workspace switching (correct usage)
- •List workspaces:
jj workspace list - •Add a workspace:
jj workspace add <path> [-r <rev>] - •Forget a workspace:
jj workspace forget <path> - •Switch workspaces by changing directories:
cd <path>
Safety notes
- •
jjhas no “current branch”; bookmarks don’t auto-advance. - •Avoid interactive flags (like
-i) in non-interactive harnesses.