A modern VCS for a civilized age jj-vcs/jj
Including notes, tasks, medications, journals and more...
About git, git internals, and how to use git more effectively...
infracloudio/infranaut-meetup#133
I've never found git to be hard, but the CLI feels arcane.
- How many of you can confidently do
git rebase? - How many of you know about
git rerere? - How many of you use more than 3 stashes?
A Git-compatible VCS that rethinks the version control interface
- Works alongside your existing
.gitfolder - Same underlying storage, better UX
- Easy to try, easy to migrate back
# Start a new repo or convert existing
jj git init --colocate .
# Or clone an existing one
jj git clone <repo-url>.jj and .git co-exist happily in the same repo
Git's model: You create commits explicitly
JJ's model: Every change is automatically a commit You organize and refine later
jj status # See what's changed
jj log # View commit history
# Make some changes to a file
jj log # Notice: changes are already committed!
jj show # See what changed
jj describe # Add a description anytimeJJ automatically tracks your working copy as a commit
Focus on writing code, not remembering to save
jj new # Start new work (no branch needed)
# Make changes
jj new # Start another piece of workCreate branches (bookmarks) only when you're ready to push
# Make changes
jj describe -m "Add feature X"
# Create a bookmark for pushing
jj bookmark create feature-x
# Push to remote
jj git pushOperations that are painful in git become trivial
You don't need to checkout a branch to rebase it
# Rebase any commit onto any other commit
jj rebase -s <source> -d <destination>No "detached HEAD" confusion
jj splitInteractively split any commit (even old ones) into multiple commits
jj edit <commit>Make changes to any commit in your history, not just the latest
Let's see how these features work together...
mkdir demodir && cd demodir
jj git init --colocate . # initialize the repository
echo 'apple' > fruit.txt
echo 'carrot' > vegetable.txt- Split the changes (jj split)
- Describe revisions (jj describe)
- Parallelize revisions (jj parallelize q::u)
- Create a merge commit (jj new)
- Make additional changes in one file
- Absorb the changes (jj absorb)
- Undo that change (jj undo)
- Rebase manually onto other branch (jj rebase)
- Name both branches (jj branch)
- Linearize it (jj rebase)
Instead of stashing:
jj new # Start new work on parent commitYour previous work stays as a commit, perfectly preserved
JJ tracks conflicts in commits
You can:
- Rebase through conflicts
- Resolve them whenever you're ready
Automatically figure out which commit each change belongs to
# Make fixes to multiple commits
jj absorbJJ absorbs changes into the right commits based on context
"stack(r)" = "r | ancestors(descendants(immutable_heads()..r), 2)"
"mine" = "remote_bookmarks() & (mine() | committer('[email protected]'))"
'closest_bookmark(to)' = 'heads(::to & bookmarks())'
'unpushed(x)' = '::x & ~reachable(::x, remote_bookmarks())'Build complex queries to select exactly the commits you want
jj op log # View all operations
jj undo # Undo last operation
jj op restore <id> # Restore to any pointEvery operation is recorded and reversible
If you ever get stuck or unsure:
git status
git log
git checkout mainYour .git folder is always there and always in sync
See how a commit has changed over time:
jj evolog <commit>Perfect for understanding what happened during complex rebases
Work naturally: Focus on code first, organize commits later
Powerful operations: Rebase, split, and modify any commit from anywhere
Safety first: Everything is undoable, conflicts can wait
Zero risk: Co-exists with git, migrate back anytime
- Complex rebasing workflows
- Feature development with lots of iteration
- Teams that value clean history
Documentation: https://martinvonz.github.io/jj/ GitHub: https://github.com/jj-vcs/jj Tutorial: https://steveklabnik.github.io/jujutsu-tutorial/
Join the Discord community for help and discussion!
- JJ rethinks the version control interface, not the storage
- Automatic commits free you to focus on code
- Complex operations become simple
- Everything is undoable
- Works alongside git, try it risk-free
Let's look at useful configurations...
Let's look at how this works in an actual project...
Seriously, ask me questions.
Give it a try: jj git init --colocate .
Abin Simon (meain)

