DEV Community

Ris Adams
Ris Adams

Posted on • Originally published at risadams.com on

Git Worktrees: Multiple Branches, Zero Context Switching

You're knee-deep in a feature branch when urgent production fire hits. Instead of stashing, switching, and losing your mental context, what if you could just... open another folder and work on the hotfix immediately? Git worktrees make this possible, and once you experience the workflow, you'll wonder how you ever lived without them.

What Are Git Worktrees?

Git worktrees let you check out multiple branches of the same repository into separate directories simultaneously. Think of it as having multiple working copies of your repo, each locked to a different branch, all sharing the same .git folder and commit history.

Here's the mental shift: instead of switching branches in one directory, you switch directories for different branches.

The difference is dramatic: traditional workflow forces sequential context switching, while worktrees enable parallel development.

Why Worktrees Change Everything

No More Stash Juggling

You know the drill: you're in flow state, deep in complex changes, when urgent work appears. With traditional git, you stash (hoping you don't forget what you were doing), switch branches, work, switch back, unstash, and spend 10 minutes remembering where you left off.

Worktrees eliminate this entirely. Your feature work stays exactly as you left it, in its own directory.

IDE State Preservation

Your IDE doesn't lose track of open files, breakpoints, or terminal sessions when you switch between worktree directories. Each branch maintains its own IDE workspace state.

Parallel Development

Need to compare implementations across branches? Open both directories in separate IDE windows. Want to copy a function from one branch to another? Simple file copy. Testing how your feature branch handles different scenarios? Keep multiple environments running simultaneously.

Setting Up Your First Worktree

Let's walk through the practical setup. I'll use a typical web app scenario where you maintain main, develop features, and handle production hotfixes.

Initial Repository Setup

Start with your existing repository:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ~/projects/myapp:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git status # confirm you're in the main branch and clean
Enter fullscreen mode Exit fullscreen mode

Creating Worktrees

Here's the playbook I'd run for a typical multi-branch workflow:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Create a worktree for your main branch (if not already there):where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add ../myapp-main main:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Create worktree for a new feature branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add ../myapp-auth -b feature-auth:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Create worktree for hotfix work:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add ../myapp-hotfix -b hotfix-critical-bug:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Create worktree for an existing remote branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add ../myapp-staging origin/staging
Enter fullscreen mode Exit fullscreen mode

Your directory structure now looks like:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
~/projects/:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── myapp/ # original clone:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── myapp-main/ # main branch worktree:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── myapp-auth/ # feature-auth branch worktree:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── myapp-hotfix/ # hotfix-critical-bug branch worktree:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
└── myapp-staging/ # staging branch worktree
Enter fullscreen mode Exit fullscreen mode

Worktree Management Commands

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# List all worktrees:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree list:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Remove a worktree (deletes the directory):where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree remove ../myapp-hotfix:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Remove worktree reference (if you manually deleted the directory):where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree prune:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Move a worktree to different location:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree move ../myapp-auth ../features/myapp-auth
Enter fullscreen mode Exit fullscreen mode

Real-World Scenarios

Scenario 1: The Production Emergency

You're implementing OAuth integration when a critical security vulnerability needs immediate patching.

Your OAuth work remains untouched, IDE state preserved, no mental context lost.

Scenario 2: Testing Across Environments

You need to verify your feature works with the current production state:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Keep feature development going in myapp-auth:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Test integration in production-like environment:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ../myapp-main:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git pull origin main # Get latest production state:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
npm start # Run production version:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# In another terminal:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ../myapp-auth:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
npm run dev # Run feature version:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Compare behaviors, check for conflicts, verify compatibility
Enter fullscreen mode Exit fullscreen mode

Scenario 3: Code Review Workflow

Someone requests changes on your PR while you're already working on the next feature:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Current work in myapp-next-feature:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# PR feedback for feature-auth branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ../myapp-auth:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Address review comments:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git add .:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git commit -m "refactor: address PR feedback":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git push:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Immediately back to new feature work:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ../myapp-next-feature
Enter fullscreen mode Exit fullscreen mode

Advanced Worktree Strategies

The Branch-Per-Directory Pattern

Organize worktrees by purpose rather than branch name:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
~/projects/myapp/:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── current/ # Your main development branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── production/ # Production/main branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── staging/ # Staging branch:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── feature/ # Current feature work:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
├── hotfix/ # Emergency fixes:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
└── experiment/ # Experimental branches
Enter fullscreen mode Exit fullscreen mode

Shared Configuration

Worktrees share the same .git directory, which means:

This is powerful for consistency but requires awareness for hooks and config that affect working directory state.

Common Gotchas and Solutions

Issue: Accidentally Committing to Wrong Branch

Problem : You forgot which worktree you're in and accidentally committed to the wrong branch.

Solution : Make your current branch and worktree obvious in your terminal or editor:

.contains-task-list{list-style:none}:not(.contains-task-list>li)>.contains-task-list{padding-left:0}

  • Customize your shell prompt to display the current branch (most modern shells and plugins support this).
  • Use directory naming conventions that include the branch or purpose.
  • Many IDEs and editors (like VS Code, JetBrains, etc.) show the current branch in the status bar—keep an eye on it before committing.
  • Consider using tools like git status or git branch --show-current to double-check your context before making changes.
  • For extra safety, set up pre-commit hooks that warn you if you're about to commit to a protected or unexpected branch.

Issue: Worktree Directory Confusion

Problem : Too many similar directory names cause confusion.

Solution : Use descriptive names and consistent patterns:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Instead of:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-feature-auth:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-feature-billing:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-hotfix-security:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# Use:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-auth-feature:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-billing-feature:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
myapp-security-hotfix
Enter fullscreen mode Exit fullscreen mode

Issue: Large Repository Performance

Problem : Multiple worktrees of large repositories consume disk space.

Solution : Use sparse-checkout for focused worktrees:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add ../myapp-frontend -b frontend-only:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd ../myapp-frontend:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git sparse-checkout init --cone:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git sparse-checkout set frontend/ shared/
Enter fullscreen mode Exit fullscreen mode

Workflow Optimization Tips

1. IDE Project Templates

Create VS Code workspace files for common worktree combinations:

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
// myapp-dev.code-workspace:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
{:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    "folders": [:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        { "path": "./myapp-main" },:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        { "path": "./myapp-feature" },:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        { "path": "./myapp-staging" }:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    ],:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    "settings": {:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        "git.defaultCloneDirectory": "./worktrees":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    }:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
}
Enter fullscreen mode Exit fullscreen mode

2. Automated Worktree Setup

Script common worktree patterns:

  • Powershell
  • bash

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# setup-feature-work.ps1:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
param([string]$FeatureName):where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add "../myapp-$FeatureName" -b "feature-$FeatureName":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
code "../myapp-$FeatureName":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
Set-Location "../myapp-$FeatureName"
Enter fullscreen mode Exit fullscreen mode

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# setup-feature-work.bash:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
FEATURE_NAME="$1":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree add "../myapp-$FEATURE_NAME" -b "feature-$FEATURE_NAME":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
code "../myapp-$FEATURE_NAME":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
cd "../myapp-$FEATURE_NAME"
Enter fullscreen mode Exit fullscreen mode

3. Cleanup Automation

  • Powershell
  • bash

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# clean-merged-worktrees.ps1:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree list --porcelain | :where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    Select-String "branch refs/heads/" | :where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    ForEach-Object { :where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        $branch = ($_ -split "/")[-1]:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        if (git branch --merged main | Select-String $branch) {:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
            Write-Host "Removing merged worktree: $branch":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
            git worktree remove "../myapp-$branch" --force:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
        }:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    }
Enter fullscreen mode Exit fullscreen mode

html:not([data-theme=dark]) .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#7a67eeb3,#8e7bf166);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0}html:not([data-theme=dark]) .code-block-container:hover:before{opacity:1}html[data-theme=dark] .code-block-container:before{content:"";opacity:.6;z-index:1;background:linear-gradient(#6f4cffcc,#a594ff80);width:4px;height:100%;transition:opacity .3s;position:absolute;top:0;left:0;box-shadow:0 0 10px #6f4cff4d}html[data-theme=dark] .code-block-container:hover:before{opacity:1}

:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# clean-merged-worktrees.bash:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
# List all worktrees and extract branch names:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
git worktree list --porcelain | \:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
  grep "branch refs/heads/" | \:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
  awk -F'/' '{print $NF}' | while read branch; do:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    # Check if branch is merged into main:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    if git branch --merged main | grep -qw "$branch"; then:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
      echo "Removing merged worktree: $branch":where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
      git worktree remove "../myapp-$branch" --force:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
    fi:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);margin:0 calc(-1*var(--ifm-pre-padding));padding:0 var(--ifm-pre-padding);display:block}.theme-code-block-highlighted-line .code-line-number:before{opacity:.8}
  done
Enter fullscreen mode Exit fullscreen mode

When NOT to Use Worktrees

Worktrees aren't always the answer:

.contains-task-list{list-style:none}:not(.contains-task-list>li)>.contains-task-list{padding-left:0}

  • Simple, linear workflows : If you rarely work on multiple branches simultaneously
  • Disk space constraints : Each worktree requires full working directory space
  • Team unfamiliarity : If your team isn't comfortable with the concept
  • Complex build systems : Some build tools don't handle multiple working directories well

The Bottom Line

Git worktrees transform your development workflow from sequential branch switching to parallel branch development. You maintain mental context, preserve IDE state, and eliminate the friction of constant stashing and switching.

Here's the playbook I'd run for getting started:

  1. Start small : Create one additional worktree for your most common secondary task (hotfixes, code review, etc.)
  2. Establish naming conventions : Consistent directory naming prevents confusion
  3. Integrate with your shell : Add branch info to prompts and create helper functions
  4. Build cleanup habits : Regularly remove completed worktrees to avoid clutter

The mental shift takes a few days, but once worktrees become part of your muscle memory, you'll find yourself significantly more productive and less frustrated with context switching.

Your future self will thank you for making this change.

Top comments (0)