jujutsu
Jujutsu
Git-compatible VCS with a different data model — no staging area, changes are immediate. Every file is tracked in the working copy as "changes" (like commits without parents).
⚠️ Never use
gitfor mutations in a jj repo — it corrupts history. Allowed:git log,git diff,git show,git blame,git grep.
Basic Workflow
Create a change, describe it, view history:
jj new # Start a new change (like working on a commit)
jj desc -m "feat: add login" # Write the message
jj log # View history — this is your main view command
jj diff # See what changed in working copy
Edit an existing change:
jj edit <change-id> # Switch to a specific change
# Make changes to files...
jj squash # Move new edits into the parent change
Time Travel & Navigation
Jump to any point in history:
jj edit @- # Go to parent
jj next --edit # Go to child
jj edit <change-id> # Jump to specific change
jj new --before @ # Insert a new change before current
Squash & Split Changes
Combine changes into one:
# Merge two changes together
jj squash -m "combined message"
# Split working copy into separate commits
jj split # Interactive — pick hunks to commit separately
Auto-move changes to relevant commits in a stack:
jj absorb # Smart squashing across mutable revisions
Rebasing & Merging
Rebase changes onto another:
jj rebase -s @- -d main # Rebase current change onto main
jj rebase -d main -s ::@ # Rebase all descendants of @ onto main
Merge two changes:
jj new x yz -m "merge" # Create merge of x and yz
Conflicts
Resolve interactively:
# Edit conflicted files, then continue
jj resolve
Pushing to Git
Bookmarks are like branches. Track and push them:
jj bookmark create main -r @ # Create a bookmark at current change
jj git push --bookmark main # Push that bookmark
jj git fetch # Fetch from remote
jj bookmark track main@origin # Track a remote bookmark
Useful Patterns
Undo an operation: jj undo — reverses the last jj command.
Get git commit hash from jj change:
jj log -T 'commit_id\n' -r @ # Full hash
jj log -T 'commit_id.short()\n' -r @ # Short hash
git rev-parse @ # Also works in colocated repos
Operation history: jj op log — see all jj operations.
Common Pitfalls
- ❌ Use
@~1→ ✅ Use@-(parent) - ❌ Use
a,b,cfor union → ✅ Usea | b | c(pipe, not comma) - ❌ Use
jj changes→ ✅ Usejj logorjj diff
Related Skills
- conventional-commits: Commit message format
- sem: Semantic analysis before writing commit messages
More from knoopx/pi
podman
Manages containers, builds images, configures pods and networks with Podman. Use when running containers, creating Containerfiles, grouping services in pods, or managing container resources.
122nix-flakes
Creates reproducible builds, manages flake inputs, defines devShells, and builds packages with flake.nix. Use when initializing Nix projects, locking dependencies, or running nix build/develop commands.
54scraping
Fetches web pages, parses HTML with CSS selectors, calls REST APIs, and scrapes dynamic content. Use when extracting data from websites, querying JSON APIs, or automating browser interactions.
48jscpd
Finds duplicate code blocks and analyzes duplication metrics across files. Use when identifying copy-pasted code, measuring technical debt, or preparing for refactoring.
45yt-dlp
Downloads videos from YouTube and other sites using yt-dlp. Use when downloading videos, extracting metadata, or batch downloading multiple files.
42nix
Runs packages temporarily, creates isolated shell environments, and evaluates Nix expressions. Use when executing tools without installing, debugging derivations, or working with nixpkgs.
42