Files
2025-11-30 09:06:18 +08:00

247 lines
4.6 KiB
Markdown

---
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 <change-id> -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 <change-id>
```
**Show log with more detail:**
```bash
jj log --stat
```
## Viewing Diffs
**See current changes:**
```bash
jj diff
```
**Diff specific commit:**
```bash
jj diff -r <change-id>
```
**Diff between two commits:**
```bash
jj diff --from <base> --to <head>
```
**Git-style diff output:**
```bash
jj diff --git
```
**Show what changed in a commit:**
```bash
jj show <change-id>
```
## 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 <change-id> -m "description"
```
## Organizing Commits
**Squash current commit into parent:**
```bash
jj squash
```
**Squash specific commit into its parent:**
```bash
jj squash -r <change-id>
```
**Squash current commit into a specific commit:**
```bash
jj squash --into <target-change-id>
```
**Move changes from one commit to another:**
```bash
jj move --from <source> --to <target>
```
**Edit an earlier commit:**
```bash
jj edit <change-id>
```
(Make changes, then `jj new` to continue)
**Split a commit into multiple:**
```bash
jj split <change-id>
```
## 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.