Over the past month, I’ve primarily used Jujutsu (jj) as my VCS, so it seems like a good time jot some thoughts down.

But git is fine, do we need another thing?

git is an amazing tool, and has really shifted how we develop software and collaborate… But change is inevitable and jj brings some new things to the table which it could be worth switching for.

Jujuwhat?

Jujutsu is a new VCS tool, which uses a git backend under the hood for the core VCS functionality. As such, it has complete interop with existing git forges (like gitlab, github) and workflows. Its frontend, however, (the CLI tool jj), has made very different choices to git’s CLI with an aim to simplify our interactions with a VCS.

The Practical Differences

No Staging Area

The biggest difference to get used to when starting with jj is that there is no staging area: jj automatically snapshots everything in your repo (aside from items listed in the repo’s .gitignore) when you run any command and adds this to the current commit. This took me quite a while to get used to, but has actually meant that my working area is kept cleaner.

No git stash

In jj, commits are very quick to create, not requiring a message or branch name. As such, “stashes” are just commits that you have not pushed yet. jj’s default log command shows these “branchless” commits so you do not lose them.

No resolve conflicts then run 'git rebase --continue'

Conflicts are first-class citizens in the data model of jj, and are managed internally in the .jj folder. They do not stop your workflow if they happen: You can happily work on a new or separate commit while things are in conflict. This is in contrast to git’s default behaviour, where a conflict must be resolved before any further work can be done. If resolving a conflict on a non-head commit, the descendant commits are automatically rebased to have this resolution as well. It is super neat, though took me a while to get used to! There is also a simple jj undo command if you make a hash of this and just want to get your world to a state it was in before.

Conclusion

I tend to think of jj (the cli utility of jujutsu is jj) as a new front-end for git with a much improved UI, rather than a new VCS in its own right. The long-term plan is more than that (see in particular 1st-class stacked diff workflows and new varieties of forges), but I have found it a more powerful and enjoyable gateway to git right now anyway.

If you want to learn more about jj, check out the repo. I also found Mr. Klabnik’s tutorial pretty useful as well as jj’s own.