Branchless git workflows

I’ve been experimenting with the so-called branchless version-control workflows. The idea is that instead of using named branches, you just juggle a bunch of commits on top of the main branch.

Here are a couple of tools implementing the idea - while Sapling and Jujutsu bill themselves as new VCSs, they both work with git repos:

  • git-branchless, which builds on top of git
  • Sapling (sl), a new VCS published by Meta
  • Jujutsu (jj), a new VCS which has some Google backing

git-branchless is the one I’ve used most so far. The others I have only dabbled with.

A central feature of these tools is the “smartlog” which shows the graph of commits you have on top of the upstream main branch. Sapling’s smartlog output looks like this - you have three commits on top of main and the @ sign indicates that you’ve checked out the commit with hash 335bb92d2.

$ sl
@  335bb92d2  3 seconds ago  miikka.koskinen
│  fix: fix bug B
│ o  d5c08952e  21 seconds ago  miikka.koskinen
├─╯  feat: implement feature A
o  5ca31cccb  69 seconds ago  miikka.koskinen
   refactor: refactor the code base

This kind of situation happens to me regularly: I’ve made a refactoring (or a bug fix) in one branch and I want to start another branch on top of it. But what happens if you spot a mistake in the refactoring and want to edit in?

In plain git, you’d probably do a fixup! commit on top of either of your branches - the one with the feature A or the bug fix B - and git rebase -i it into the refactoring commit. Then you’d rebase the other branch on top of the new refactoring commit.

In Sapling, you’d switch to the refactoring commit with sl previous or sl goto and use sl amend to edit it. This automatically rebases the descendant commits on top of the new commit.

This is especially nice if you like to use stacked PRs. I’ve lately used them a lot since I’ve worked on big changes that would be difficult to review at once. I’ve yet to try any of the tools’ GitHub integration - I’ve just manually managed the PRs - but the tools make it easier to deal with the code review fixes to the root PR.

Another thing it’s good for is creating experimental commits - having the smartlog and not having to name your branches removes a lot of friction from branching out for experiments.

All of this is possible with plain git, but the new tools make it more convenient and less error-prone.

Comments or questions? Send me an e-mail.