--- name: working-with-jj description: Jujutsu (jj) version control cheatsheet - viewing history, making commits, diffs, and descriptions --- # Working with Jujutsu (jj) Quick reference for common Jujutsu operations used in development workflows. Jujutsu is a Git-compatible VCS that eliminates staging and treats your working directory as an actual commit that continuously updates. ## Detecting Jujutsu Check if the project uses jj: ```bash test -d .jj && echo "jj" || echo "not jj" ``` ## Key Concepts - **`@`** - Your current working copy (like Git's HEAD) - **`@-`** - Parent of working copy (like Git's HEAD~1) - **No staging area** - Changes are automatically recorded - **Change IDs** - Stable identifiers that survive rebases - **Commit IDs** - Traditional hashes compatible with Git ## Recommended Workflow **The jj way:** 1. Make edits to files 2. Run `jj new` to create a new commit (repeat for every logical change) 3. After a series of commits, go back and review with `jj log` 4. Add meaningful descriptions with `jj describe -m "description"` 5. Squash related commits together with `jj squash` This workflow creates fine-grained history as you work, then lets you organize it meaningfully afterward. ## Viewing the Log **Show recent commits:** ```bash jj log -r @~10..@ ``` **Show full log:** ```bash jj log ``` **Show specific commit:** ```bash jj show ``` **Show log with more detail:** ```bash jj log --stat ``` ## Viewing Diffs **See current changes:** ```bash jj diff ``` **Diff specific commit:** ```bash jj diff -r ``` **Diff between two commits:** ```bash jj diff --from --to ``` **Git-style diff output:** ```bash jj diff --git ``` **Show what changed in a commit:** ```bash jj show ``` ## Getting Commit References **Current commit ID:** ```bash jj log -r @ -T commit_id --no-graph ``` **Parent commit ID:** ```bash jj log -r @- -T commit_id --no-graph ``` **Get change ID:** ```bash jj log -r @ -T change_id --no-graph ``` **Revset references:** - `@` - working copy commit - `@-` - parent commit - `@--` - grandparent commit - `root()` - the root commit - `trunk()` - main branch tip ## Making Commits **Create new commit (after editing files):** ```bash jj new ``` **Create new commit with message:** ```bash jj new -m "commit message" ``` **Commit current changes with description:** ```bash jj describe -m "commit message" jj new ``` **Note:** Unlike Git, jj automatically tracks file changes. No `add` command needed! ## Setting Descriptions **Set description for current commit:** ```bash jj describe -m "new description" ``` **Set description in editor:** ```bash jj describe ``` **Set description for specific commit:** ```bash jj describe -m "description" ``` ## Organizing Commits **Squash current commit into parent:** ```bash jj squash ``` **Squash specific commit into its parent:** ```bash jj squash -r ``` **Squash current commit into a specific commit:** ```bash jj squash --into ``` **Move changes from one commit to another:** ```bash jj move --from --to ``` **Edit an earlier commit:** ```bash jj edit ``` (Make changes, then `jj new` to continue) **Split a commit into multiple:** ```bash jj split ``` ## Status Information **See current status:** ```bash jj status ``` **See bookmark (branch) info:** ```bash jj bookmark list ``` ## Common Patterns **Get range for code review:** ```bash BASE_SHA=$(jj log -r @- -T commit_id --no-graph) HEAD_SHA=$(jj log -r @ -T commit_id --no-graph) echo "Reviewing: $BASE_SHA..$HEAD_SHA" ``` **Compare against trunk:** ```bash jj diff --from trunk() --to @ ``` **See files changed:** ```bash jj diff --summary ``` ## Git Interoperability **Fetch from Git remote:** ```bash jj git fetch ``` **Push to Git remote:** ```bash jj git push ``` **Export to colocated Git repo:** ```bash jj git export ``` ## Workflow Comparison | Task | Git | Jujutsu | |------|-----|---------| | Make commit | `git add . && git commit -m "msg"` | `jj describe -m "msg" && jj new` | | See changes | `git diff` | `jj diff` | | View history | `git log` | `jj log` | | Get current SHA | `git rev-parse HEAD` | `jj log -r @ -T commit_id --no-graph` | | Amend commit | `git commit --amend` | `jj describe` (then `jj new` if done) | | No staging | (N/A) | Automatic! | ## Why Jujutsu? - **No staging area confusion** - Edit files, they're tracked - **No detached HEAD** - All commits are reachable - **Conflict tracking** - Conflicts are first-class objects - **Safe experimentation** - Easy to undo anything - **Git compatible** - Works with GitHub, GitLab, etc.