Loading...
Loading...
Manage version control with Jujutsu (jj) — no staging area, immediate changes, smart rebasing. Use when navigating history, squashing, or pushing to Git remotes.
npx skill4agent add knoopx/pi jj-core⚠️ Never usefor mutations in a jj repo — it corrupts history. Allowed:git,git log,git diff,git show,git blame.git grep
jj new # Start a new change (like working on a commit)
jj desc -m "feat: add login" # Write the message
jj log # View history — this is your main view command
jj diff # See what changed in working copyjj edit <change-id> # Switch to a specific change
# Make changes to files...
jj squash # Move new edits into the parent changejj edit @- # Go to parent
jj next --edit # Go to child
jj edit <change-id> # Jump to specific change
jj new --before @ # Insert a new change before current# Merge two changes together
jj squash -m "combined message"
# Split working copy into separate commits
jj split # Interactive — pick hunks to commit separatelyjj absorb # Smart squashing across mutable revisionsjj rebase -s @- -d main # Rebase current change onto main
jj rebase -d main -s ::@ # Rebase all descendants of @ onto mainjj new x yz -m "merge" # Create merge of x and yz# Edit conflicted files, then continue
jj resolvejj bookmark create main -r @ # Create a bookmark at current change
jj git push --bookmark main # Push that bookmark
jj git fetch # Fetch from remote
jj bookmark track main@origin # Track a remote bookmarkjj undojj log -T 'commit_id\n' -r @ # Full hash
jj log -T 'commit_id.short()\n' -r @ # Short hash
git rev-parse @ # Also works in colocated reposjj op log-T--templateconcat()# ❌ WRONG — no implicit joining
jj log -r @ -T 'commit_id.short() description'
# ❌ WRONG — method chaining without concat
jj log -r @ -T 'change_id.short() " | " commit_id.short()'
# ✅ RIGHT — explicit concat
jj log -r @ -T 'concat(change_id.short(), " | ", description)'change_idcommit_iddescriptionauthorcommittersignaturedescriptiondesc# ❌ WRONG — undefined field
jj log -r @ -T 'desc'
# ✅ RIGHT
jj log -r @ -T 'description'# ✅ RIGHT — double quotes around revision set with pipe
jj log -r "id1 | id2" -T 'concat(change_id.short(), "\n", description)'
# ❌ WRONG — single quotes don't expand variables and can nest incorrectly
jj log -r 'id1 | id2' -T 'description'jj desc@# Always verify with the original change ID, not @
jj desc -r <change-id> -m "new description"
jj log --no-graph -r <change-id> -T 'concat(change_id.short(), " | ", description)'@~1@-a,b,ca | b | cjj changesjj logjj diffconcat(a, b)descdescription@jj desc