4 minutes
Jujutsu: The Version Control System That Made Me Rethink My Workflow ( Part 1 )
I started working on IT around 2010, and basically I was born in this world
with git and Github
as the de facto standard to work with others and share
code. It didn’t help that it was initially built by Linux Torvalds to make a me
true believer on the gospel of Git. At one of my first job I also tried subversion, but it was
during a very short period of time that I cannot remember having an issue
or even thinking about how it was supposed to work.
It’s been almost 15 long years building CI/CD pipelines using git as the
source control. 15 years reviewing pull requests, doing rebase
, bisect
,
worktree
, amend or lately playing with sparse-checkout on big monorepos.
Even when I knew there were other VCS available and even big companies such
as Google or Meta use their own home grown systems, I never even thought
that git would be replaced at least on my personal workflows.
But here I am, on 2025 I found out about Jujutsu and I got curious mostly
because it promised a better user experience, and I thought that git
user
experience was fine, I assumed it could be improved but never thought it
was hard in any form (This is just Curse of knowledge bias I know, I just got too
comfortable working with git). But that got me into researching what was the
fuzz about the new kid on the block.
Well, it got me, I had to relearn some concepts but what I loved was how
easy and simple were some task I was used to do on git, such as rebase
or
squash
or just rewriting history. I started to love revset
language,
even working with conflicts stopped being a hard thing to do (Spoiler
Alert, you can just ignore it, and keep working until you get the time to
resolve it).
❗ Caution
This blog post is going to be long, and will be splited on many different post, but it won’t replace reading from official documentation; I write about my experience and what I’ve learned. Also Jujutsu is currently under heavy development so it’s possible that many things I write today may become outdated in the future (I will try to update whenever happens).
Basics
Installation
Instructions for installing for different Linux distributions and other
Operating Systems are very clear on the documentation: https://jj-vcs.github.io/jj/latest/install-and-setup/.
But because we are already here, if you have cargo-bininstall
in your
system, install it this way:
cargo binstall --strategies crate-meta-data jj-cli
If you need or prefer something different, check the documentation.
Clone and Init
The most common work in with git
is starting new projects or cloning one
from a forge such as github or gitlab.
$ jj git clone https://github.com/kubernetes/kubernetes.git
jj
has a compatibility mode for git
named colocate
. With this mode
you can run both jj
and git
commands at the same repository. It’s
really useful if you need git features that are not implemented yet or will not
be implemented on jj. Also many dev tools will not work as expected if the
repository you are working is not a git repository.
💡 Tip
To clone a git repository using colocate mode:
$ jj git clone https://github.com/kubernetes/kubernetes.git --colocate
If your repository is already clone on your local, you can make it work with jj
running:
jj git init -- colocate
Log and working revision
jj
takes ideas from different vcs, many of those ideas I didn’t even know existed.
Revisions are inspired from mercurial, and I took a while on understand them but
after giving it a good amount of brain power I find it a more natural way of thinking
about changes.
Keeping on kubernetes repository:
$ jj log
@ qzmttztq christopher@valerio.guru 2025-09-28 17:13:16 ae8d1294
│ (empty) (no description set)
◆ wpmytzyq 20407524+k8s-ci-robot@users.noreply.github.com 2025-09-28 09:00:16 master git_head() 5161bf00
│ (empty) Merge pull request #134268 from joshjms/gce-test-fix-etcd-manifest
~
@
Is an alias of the working copy, you can see that it also has qzmttzqt
string which
is a change id, that is different from the git hash, which are immutable. The working
copy on jujutsu
is also a commit which differs from git. (It was hard to grasp at
the beginning).
Running jj st
which is short for jj status
shows what changes has been done on
the working copy:
$ jj st
The working copy has no changes.
Working copy (@) : qzmttztq ae8d1294 (empty) (no description set)
Parent commit (@-): wpmytzyq 5161bf00 master | ()
Here again we can see @
but also @-
which is an alias for parent commit, you
could go further like: @--
looking for grand dad commit. But I guess is not the
best idea.
Conclusion
This is just the start, I will keep posting my experience with jujutsu
and how it
has changed the way I work with git.