Effective Git - Worktrees

Worktrees can make switching branches easier

Ingo Richter

2 minute read

You know this situation: you are working on new feature branch of your product. A bunch of files has been changed, nothing has settled yet and lots of uncommitted changes. This is how work in progress looks like. Everything could be alright, but then you are asked to check out that high priority issue that a customer reported.

What I did in this situation

  • stash my changes with git stash save and provide a meaningful message for when I have to unstash my changes
  • changes branches and pull from master
  • build the product
  • repro the issue
  • create a new branch for the fix
  • implement the fix and push to the newly created branch
  • let somebody else verify the fix
  • go back to my previous branch
  • git stash pop my work in progress
  • continue working on the feature

Introducing Worktrees

I was reading git release notes and I stumbled upon something I haven’t heard before in the git context: worktree. It’s not a new feature. It was introduced back in 2015, but I discovered it a couple of weeks ago. It reminded me of the time when I used Perforce and I had to create a Workspace for everything I was working on (okay, it wasn’t that bad).

The help for git help worktree gives you a very short summary of some operations available for worktrees.

       git-worktree - Manage multiple working trees

       git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<branch>]
       git worktree list [--porcelain]
       git worktree lock [--reason <string>] <worktree>
       git worktree prune [-n] [-v] [--expire <expire>]
       git worktree unlock <worktree>

Sounds interesting to me. Let’s check it out.

IMHO worktrees have a couple of advantages over another git clone:

  • less space wasted with another clone of the same repo
  • easier to compare files between different worktrees
  • work on multiple branches of the same repo without the hassle of messing everything up when switching branches (this happened a lot for me in the past)

BTW: the current project directory is a worktree too.

There might be other good solutions to support that sort of workflows. git is versatile and powerful. I has a lot to offer and there are so many different ways to achieve the same result. Worktrees are a great addition and they make good sense. Your mileage may vary.

Thanks for reading!

Feel free to share, leave a comment or just ignore it.

comments powered by Disqus