This skill should be used when the user mentions Jujutsu version control, "jj" commands, working with jj repositories, or asks about Git to Jujutsu equivalents. Triggers on keywords like "jujutsu", "jj", "jj-vcs", "jj repo", "jj commit", "jj log", "jj new", "jj squash", "jj rebase", "jj bookmark", or questions about Jujutsu workflows and concepts.
Coding
281 Stars
17 Forks
Updated Jan 19, 2026, 02:17 AM
Why Use This
This skill provides specialized capabilities for ahmedelgabri's codebase.
Use Cases
Developing new features in the ahmedelgabri repository
Refactoring existing code to follow ahmedelgabri standards
Understanding and working with ahmedelgabri's codebase structure
---
name: jujutsu
description: |
This skill should be used when the user mentions Jujutsu version control, "jj" commands, working with jj repositories, or asks about Git to Jujutsu equivalents. Triggers on keywords like "jujutsu", "jj", "jj-vcs", "jj repo", "jj commit", "jj log", "jj new", "jj squash", "jj rebase", "jj bookmark", or questions about Jujutsu workflows and concepts.
version: 1.0.0
---
# Jujutsu (jj) Version Control Skill
This skill enables working with Jujutsu, a Git-compatible version control system
with a fundamentally different model. Jujutsu treats the working copy as a
commit, has no staging area, and uses change IDs for stable references across
rewrites.
## Core Concepts
### Working Copy as a Commit
Unlike Git, the working copy IS a commit. Changes are automatically snapshotted
when running `jj` commands - no explicit `add` or staging required.
### Change IDs vs Commit IDs
Every commit has two identifiers:
- **Change ID**: Stable across rewrites (e.g., `kkmpptxz`)
- **Commit ID**: Hash-based, changes on rewrite (e.g., `abc123def`)
Use change IDs for references that survive rebases.
### Revsets
Revsets are expressions to select commits:
- `@` - Working copy commit
- `@-` - Parent of working copy
- `root()` - Repository root
- `bookmarks()` - All bookmarked commits
- `foo..bar` - Commits from foo to bar (exclusive)
- `foo::bar` - Commits from foo to bar (inclusive)
- `A | B` - Union
- `A & B` - Intersection
- `~A` - Complement
### Bookmarks (not Branches)
Bookmarks are named pointers that map to Git branches. They move automatically
when commits are rewritten.
## Quick Reference
| Git Command | Jujutsu Equivalent | Notes |
| --------------------------- | ------------------------- | -------------------------------- |
| `git init` | `jj git init` | Use `--colocate` for Git interop |
| `git clone URL` | `jj git clone URL` | Git repos only |
| `git status` | `jj st` | Shows working copy diff |
| `git diff` | `jj diff` | Diff of working copy |
| `git diff --staged` | N/A | No staging area |
| `git add && git commit` | `jj commit` | Auto-includes all changes |
| `git commit --amend` | `jj squash` | Squash into parent |
| `git log --oneline --graph` | `jj log` | Visual commit graph |
| `git show COMMIT` | `jj show REV` | Show revision details |
| `git checkout -b NAME` | `jj new` | Start new change |
| `git switch BRANCH` | `jj edit BOOKMARK` | Edit existing change |
| `git reset --hard` | `jj abandon` | Discard working copy |
| `git stash` | `jj new` | Just start new change |
| `git rebase B A` | `jj rebase -b A -d B` | Rebase A onto B |
| `git cherry-pick` | `jj duplicate` | Copy commits |
| `git merge` | `jj new A B` | Creates merge commit |
| `git fetch` | `jj git fetch` | Fetch from remote |
| `git push` | `jj git push` | Push bookmarks |
| `git branch NAME` | `jj bookmark create NAME` | Create bookmark |
## Common Workflows
### Starting Work
```bash
# Clone a repo
jj git clone https://github.com/owner/repo
# Or init in existing directory
jj git init --colocate
# Create new change from main
jj new main
# Work on files (no add needed)
# Edit files...
# Describe the change
jj describe -m "feat: add new feature"
# Finish and start next change
jj new
```
### Viewing State
```bash
# Show log with graph
jj log
# Show working copy diff
jj diff
# Show specific revision
jj show @-
# Status of working copy
jj st
# Show file at revision
jj file show path/to/file -r REV
```
### Modifying History
```bash
# Squash working copy into parent
jj squash
# Squash specific change into parent
jj squash -r CHANGE
# Interactive squash (select hunks)
jj squash -i
# Split a commit
jj split
# Edit a commit message
jj describe -r REV -m "new message"
# Edit an older commit
jj edit CHANGE
# Make changes...
jj new # Return to tip
```
### Rebasing
```bash
# Rebase current change onto main
jj rebase -d main
# Rebase branch onto main
jj rebase -b BRANCH -d main
# Rebase revision and descendants
jj rebase -r REV -d DEST
# Rebase source and descendants
jj rebase -s SOURCE -d DEST
```
### Bookmarks and Remotes
```bash
# Create bookmark at current change
jj bookmark create NAME
# Create bookmark at specific revision
jj bookmark create NAME -r REV
# Move bookmark
jj bookmark move NAME -r REV
# List bookmarks
jj bookmark list
# Track remote bookmark
jj bookmark track NAME@origin
# Push bookmark to remote
jj git push --bookmark NAME
# Push all bookmarks
jj git push --all
# Fetch from remote
jj git fetch
```
### Working with GitHub
```bash
# Create PR branch
jj new main
# Work...
jj describe -m "feat: my feature"
jj bookmark create my-feature
jj git push --bookmark my-feature
# Update PR after review
jj edit my-feature
# Make changes...
jj git push --bookmark my-feature
# After merge, clean up
jj git fetch
jj bookmark delete my-feature
```
### Conflict Resolution
Conflicts in Jujutsu don't block rebases - they're recorded in commits.
```bash
# Check for conflicts
jj log # Conflicted commits shown with marker
# Resolve conflicts
jj new CONFLICTED_CHANGE
# Edit conflict markers in files
jj squash # Squash resolution into conflicted change
# Or use resolve command
jj resolve
```
### Undo Operations
```bash
# View operation log
jj op log
# Undo last operation
jj undo
# Restore to specific operation
jj op restore OP_ID
```
## Key Differences from Git
1. **No staging area**: All file changes automatically included
2. **Working copy is a commit**: Always have a "draft" commit
3. **Conflicts don't block**: Rebases complete, conflicts recorded
4. **Change IDs**: Stable references across history rewrites
5. **Operation log**: Full undo capability for any operation
6. **Automatic snapshot**: No risk of losing uncommitted work
## Colocated vs Non-colocated
**Colocated** (`jj git init --colocate`):
- `.git` and `.jj` in same directory
- Can use Git tools alongside jj
- Git sees jj commits
**Non-colocated** (`jj git init`):
- Only `.jj` directory
- Pure jj workflow
- Use `jj git export` to sync to Git
## Additional Resources
### Reference Files
For detailed command reference and advanced workflows:
- **`references/git-command-table.md`** - Complete Git to Jujutsu command
mapping
- **`references/revsets.md`** - Revset syntax and examples
### External Documentation
- Official docs: https://docs.jj-vcs.dev/latest/
- Tutorial: https://docs.jj-vcs.dev/latest/tutorial/
- GitHub workflow: https://docs.jj-vcs.dev/latest/github/