From version-control
Version control workflow using jujutsu (jj) exclusively. Use for any version control operation — commits, bookmarks, diffs, history, rebasing, squashing, or syncing with remotes. DO NOT use git commands; use jj commands instead. Jujutsu uses bookmarks (not branches), changes (not commits), and automatically snapshots the working copy.
How this skill is triggered — by the user, by Claude, or both
Slash command
/version-control:version-controlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Note**: Current as of jujutsu version **0.37.0**. Run `jj --version` to check your version and `jj help` for the latest command reference.
Note: Current as of jujutsu version 0.37.0. Run
jj --versionto check your version andjj helpfor the latest command reference.
Forget everything you know about git.
Use jujutsu exclusively. NEVER use git commands directly — always use jj.
@ is the working copy (current change)@- is the parent of working copyWhen creating bookmarks (which become branch names when pushed to the git remote), use:
acaloiaro/<task-id>/<generated-bookmark-name>
acaloiaro — always prefix with the user's identifier.<task-id> — the issue/ticket ID only when you're already aware of one in the current context. Use whatever tracker is in play: a Jira key (GREEN-12345), a Trello card ID, a Linear/GitHub issue number, etc. If no task ID is in context, omit this segment entirely and use acaloiaro/<generated-bookmark-name>. Never invent or guess an ID.<generated-bookmark-name> — a short, kebab-case summary of the work (e.g., fix-auth-redirect, add-bulk-export).Some jj subcommands require a TTY — they open $EDITOR, a TUI diff selector, or a merge tool. Run these inside a floating multiplexer pane with run-in-mux (works in both zellij and tmux), otherwise they will fail or hang:
run-in-mux -- hookable --interactive --no-exit-code --cmd '<interactive jj command>'
Interactive commands that require run-in-mux:
jj describe (without -m) — opens $EDITOR for the change descriptionjj commit (without -m) — opens $EDITOR for the change descriptionjj split — opens the interactive diff selectorjj split -i / jj split --interactive — interactive diff selectorjj squash -i / jj squash --interactive — interactive diff selectorjj restore -i / jj restore --interactive — interactive diff selectorjj diffedit — opens the configured diff editorjj resolve — opens the configured merge tool for conflictsjj config edit — opens $EDITOR for the config filejj diff --tool difft (and other TUI diff tools) — interactive pager/viewerjj log with a TUI pager (less, delta --paging=always, etc.) when output is longNon-interactive alternative: whenever you already know the description, pass -m "msg" to jj describe/jj commit so no editor is needed and run-in-mux can be skipped.
# Make your changes to files (automatically snapshotted)
jj describe -m "your commit message"
jj bookmark create acaloiaro/your-bookmark-name
jj git push
jj git fetch
jj new main
# Make changes...
jj describe -m "message"
jj bookmark create acaloiaro/feature-name
jj git push
jj git fetch
jj rebase -d main
jj git push
jj new your-bookmark
# Make fixes...
jj describe -m "address review comments"
jj bookmark move your-bookmark --to @
jj git push
jj new @- # Create change on parent
# Make fixes...
jj squash # Squash into parent
jj status # View working copy status (alias: jj st)
jj log # View history
jj log -r '@::' # View @ and descendants
jj diff # View changes in @
jj diff -r @- # View changes in parent
jj show # Show current change details
jj describe -m "msg" # Set description for @
jj new # Create new empty change on top of @
jj new main # Create new change on top of main
jj new -m "msg" # Create new change with description
jj commit -m "msg" # Describe @ and create new change on top
jj bookmark create name # Create bookmark at @ (alias: jj b c)
jj bookmark rename OLD NEW # Rename bookmark (alias: jj b r)
jj bookmark move name --to REV # Move bookmark to revision (alias: jj b m)
jj bookmark delete name # Delete bookmark (alias: jj b d)
jj bookmark list # List all bookmarks (alias: jj b l)
jj bookmark track name --remote origin # Track remote bookmark (alias: jj b t)
jj squash # Squash @ into parent
jj squash -r REV # Squash REV into its parent
jj squash --into REV # Squash @ into specified revision
jj split # Split current change interactively
jj abandon # Abandon current change
jj abandon REV # Abandon specified revision
jj rebase -d main # Rebase current branch onto main
jj rebase -d main@origin # Rebase onto remote main
jj rebase -b @ -d main # Rebase branch containing @ onto main
jj rebase -r @ -d main # Rebase only @ (not descendants)
jj git fetch # Fetch from all remotes
jj git push # Push tracked bookmarks (default)
jj git push --bookmark name # Push specific bookmark
jj git push --deleted # Push all deleted bookmarks
jj git push --dry-run # Preview what will be pushed
jj git remote list # List remotes
Renaming Bookmarks with Remote:
jj bookmark rename old-name new-name # Rename locally
jj git push --bookmark new-name # Push new name
jj git push --deleted # Delete old name from remote
Common revset expressions:
| Expression | Description |
|---|---|
@ | Working copy |
@- | Parent of @ |
@-- | Grandparent of @ |
main | Bookmark named "main" |
main@origin | Remote tracking bookmark |
x..y | Ancestors of y, not ancestors of x |
::x | x and all ancestors |
x:: | x and all descendants |
For complete revset syntax, run jj help -k revsets.
jj edit is discouraged; prefer jj new + jj squashjj help <command> for detailed command helpjj help -k <keyword> for topic help (e.g., jj help -k revsets)Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub acaloiaro/nixos-system --plugin version-control