jj-vcs
Installation
SKILL.md
Core mental model
jj is a Git-compatible version control system built around changes (revisions) that evolve over time. Each change has a change ID (stable — follows the change across rebases) and a commit hash (changes whenever the commit content changes). Refer to changes by their change ID (short prefix form) when you want to track a logical change, or by commit hash when pinning exact content.
Key differences from Git:
- No staging area. The working copy (
@) is itself a commit.jj statuscompares@to its parent. Changes to tracked files are automatically part of@. - Change IDs, not branch names, are the primary way history is organized. A commit's change ID survives rebase, squash, and split.
- Operation log. Every jj command creates an operation.
jj undosimply undoes the last operation.jj op logshows the full history of commands run. Nothing is lost unless you explicitly garbage-collect. - Bookmarks, not branches. Bookmarks are labels on revisions. To move a bookmark to point at a different revision, use
jj bookmark move. Git branches are just bookmarks that jj syncs to the remote. - Revsets. jj's revision selection language. Used everywhere commands accept revisions. Learn the common patterns (see core-concepts.md).
Finding the right command
Daily work loop
The core cycle is: start a change → make edits → describe → (optionally) start the next change.