DEV Community

Cover image for git-worktree: Working on multiple branches at the same time

git-worktree: Working on multiple branches at the same time

Jean-Michel Plourde on March 13, 2022

Cover photo by Lucas van Oort on Unsplash My struggles I can't count how many times this happened to me while working on a project: I a...
Collapse
 
matthewpersico profile image
Matthew O. Persico

This is pretty much what I do. Every new project gets a new worktree in the wt subdir of the repo named after the branch I am working on. All I need to do to switch projects is cd - no worry about what files will be stashed, what I lose in a branch switch, etc. In fact I have wrapped all of this in scripts that keep track of all these directories so that I type git go to get a list of them in a SELECT menu and git go <regexp. to filter the choices,

Collapse
 
jmplourde profile image
Jean-Michel Plourde

The script is a very good idea and it gives me inspiration. Do you use bare repos?

Collapse
 
matthewpersico profile image
Matthew O. Persico

Nope. I have a LARGE set of git wrappers such that when I type:

github-forknclone someorg/somerepo
Enter fullscreen mode Exit fullscreen mode
  • the repo gets forked if I haven't already
  • the repo gets cloned in ~/gits/github/org/repo
  • the command creates the directory ~/gits/github/org/repo/wt.

Then I git go somerepo to cd to ~/gits/github/org/repo and type

git worktree cre foobr
Enter fullscreen mode Exit fullscreen mode

which

  • creates the foobr branch
  • cd's to ./wt
  • creates the foobr directory
  • creates the foobr worktree, using foobr branch in the foobr directory

It's a hairy complicated mess that has grown over the past 7 years. The key to it all is that I have a function called git. Yep. I do my OWN dispatch. Otherwise, you can't add to existing git commands.

If you want to see it: github.com/matthewpersico/personal

Thread Thread
 
jmplourde profile image
Jean-Michel Plourde

That's a kinda neat solution and if that works for you that's good.

Thread Thread
 
matthewpersico profile image
Matthew O. Persico

Yeah. I keep thinking about breaking it out into its own repo,but it’s just too intertwined with lots of my utility stuff. And, it could probably use a rewrite in Python or Perl for most of the gymnastics it does in shell with git hub api. But who has the time? I cobbled it together over 7 years at my $job.

Collapse
 
otromas1 profile image
J. Carlos Guijarro

Just what I was looking for

Thanks for sharing ;)

Collapse
 
jmplourde profile image
Jean-Michel Plourde

Glad it helped you!

Collapse
 
lgrahulyadav profile image
Rahul Yadav

Loved it.

Collapse
 
jmplourde profile image
Jean-Michel Plourde

Thanks! I will update it soon enough since I've been using worktrees for a while now. What changed most is that I avoid having worktrees directly in the project folder where the .git folder is.

Collapse
 
marcomoscatelli profile image
Marco Moscatelli

Great article mate!

Collapse
 
jmplourde profile image
Jean-Michel Plourde

Thanks, your comment really means a lot to me!