Skip to content
git-worktrees logo

Git Worktrees

git-worktrees

Use git worktrees for parallel development on multiple branches simultaneously

mattnigh/skills_collection0installs24stars

SKILL.md

Full skill instructions

Git Worktrees

Overview

Git worktrees allow you to have multiple working directories from the same repository, each with a different branch checked out. Work on multiple branches simultaneously without switching.

When to Use Worktrees

✅ Perfect For:

  • Stacked PR development (one worktree per PR)
  • Urgent hotfix while working on feature
  • Parallel development on multiple features
  • Code review in isolation
  • Testing cross-branch interactions
  • Running multiple dev servers simultaneously

⚠️ Consider Alternatives When:

  • Limited disk space (worktrees duplicate working directory)
  • Simple branch switching is sufficient
  • Only working on one branch at a time

Basic Workflow

Create Worktree

New Branch:

# Create worktree with new branch
git worktree add ../​worktrees/​feature-auth -b feature/​authentication

# Navigate to worktree
cd ../​worktrees/​feature-auth

Existing Branch:

# Create worktree from existing remote branch
git worktree add ../​worktrees/​feature-profile feature/​user-profile

# Or from origin
git worktree add ../​worktrees/​review origin/​feature/​pr-to-review

List Worktrees

git worktree list

# Output:
# /​Users/​dev/​project              abc123 [main]
# /​Users/​dev/​worktrees/​f-auth     def456 [feature/​authentication]
# /​Users/​dev/​worktrees/​f-profile  ghi789 [feature/​user-profile]

Remove Worktree

# Remove worktree (deletes directory)
git worktree remove ../​worktrees/​feature-auth

# Or manually delete directory and prune
rm -rf ../​worktrees/​feature-auth
git worktree prune

Directory Structure

Recommended layout:

/​Users/​dev/
├── my-project/              # Main repository
│   ├── .git/               # Git database
│   ├── src/
│   └── ...
└── my-project-worktrees/    # All worktrees here
    ├── feature-auth/       # feature/​authentication branch
    ├── feature-profile/    # feature/​user-profile branch
    ├── hotfix-urgent/      # hotfix/​urgent-fix branch
    └── review-pr-123/      # Reviewing PR #123

Use Case: Stacked PRs

Perfect for stacked PR workflow - one worktree per PR:

# Create worktree for each PR in stack
git worktree add ../​stack/​pr-001 -b feature/​001-base-auth
git worktree add ../​stack/​pr-002 -b feature/​002-user-profile
git worktree add ../​stack/​pr-003 -b feature/​003-admin-panel

# Work in each independently
cd ../​stack/​pr-001
# Implement base auth
git commit -am "feat: base authentication"
git push -u origin feature/​001-base-auth

cd ../​stack/​pr-002
# Already on feature/​002-user-profile branch
# Implement user profile (depends on pr-001)
git commit -am "feat: user profile with auth"
git push -u origin feature/​002-user-profile

cd ../​stack/​pr-003
# Implement admin panel (depends on pr-002)
git commit -am "feat: admin panel"
git push -u origin feature/​003-admin-panel

Use Case: Parallel Development

Run multiple dev servers simultaneously:

# Terminal 1: Main feature development
cd /​project-worktrees/​feature-new-ui
npm install
npm run dev  # Server on port 3000

# Terminal 2: Urgent hotfix (different branch)
cd /​project-worktrees/​hotfix-critical
npm install
npm run dev -- --port 3001  # Server on port 3001

# Both running simultaneously without branch switching

Use Case: Code Review

Review PRs in isolation:

# Create worktree for PR review
git worktree add ../​review/​pr-456 origin/​feature/​user-auth

cd ../​review/​pr-456
npm install
npm test
npm run dev

# Review code, test functionality
# When done, remove worktree
cd /​main-project
git worktree remove ../​review/​pr-456

Updating Stacked PRs with Worktrees

When base PR changes, update chain across worktrees:

# PR-001 got feedback
cd /​stack/​pr-001
git pull origin feature/​001-base-auth
# Make changes, push

# Update PR-002 (in separate worktree)
cd /​stack/​pr-002
git rebase feature/​001-base-auth
git push --force-with-lease origin feature/​002-user-profile

# Update PR-003 (in separate worktree)
cd /​stack/​pr-003
git rebase feature/​002-user-profile
git push --force-with-lease origin feature/​003-admin-panel

Managing Dependencies

Shared node_modules (Save Disk Space)

Option 1: Symlink

cd /​worktrees/​feature-auth
ln -s /​main-project/​node_modules node_modules

Option 2: Separate Install

cd /​worktrees/​feature-auth
npm install  # Independent node_modules

Trade-off:

  • Symlink: Less disk space, may have version conflicts
  • Separate: More disk space, guaranteed isolation

Best Practices

1. Naming Convention

# Use descriptive, consistent names
git worktree add ../​worktrees/​feature-authentication feature/​authentication
git worktree add ../​worktrees/​hotfix-security hotfix/​security-patch

2. Location Strategy

# Keep worktrees outside main repo
/​Users/​dev/​project/              # Main repo (never delete)
/​Users/​dev/​project-worktrees/    # All worktrees here (safe to delete)

3. Cleanup Discipline

# When PR merged, remove worktree immediately
git worktree remove path/​to/​worktree

# Periodically check for stale worktrees
git worktree prune

# Delete merged branches
git branch -d feature/​old-branch
git push origin --delete feature/​old-branch

4. One Branch Per Worktree

❌ WRONG: Switching branches in worktree defeats the purpose
✅ CORRECT: Each worktree permanently on one branch

Common Commands

# Create worktree with new branch
git worktree add <path> -b <branch>

# Create worktree from existing branch
git worktree add <path> <branch>

# List all worktrees
git worktree list

# Remove worktree
git worktree remove <path>

# Clean up stale references
git worktree prune

# Move worktree to different location
git worktree move <old-path> <new-path>

Troubleshooting

Issue: "fatal: '<branch>' is already checked out"

Cause: Branch is checked out in another worktree

Solution:

# List worktrees to find where branch is checked out
git worktree list

# Either work in existing worktree or remove it first
git worktree remove <path-to-old-worktree>

Issue: Disk space concerns

Solution:

  • Use symlinks for node_modules
  • Remove worktrees when PRs merged
  • Run git worktree prune regularly
  • Consider using sparse-checkout for large repos

Issue: IDE confusion with multiple worktrees

Solution:

  • Open each worktree as separate workspace
  • Use IDE's multi-window/​split-workspace features
  • Name worktrees descriptively for easy identification

Agent Instructions

When delegating worktree setup to version-control agent:

Task: Create worktrees for stacked PR development

Requirements:
- Create 3 worktrees in /​project-worktrees/
- Worktree 1: pr-001 with branch feature/​001-base-auth
- Worktree 2: pr-002 with branch feature/​002-user-profile
- Worktree 3: pr-003 with branch feature/​003-admin-panel

Commands:
git worktree add ../​project-worktrees/​pr-001 -b feature/​001-base-auth
git worktree add ../​project-worktrees/​pr-002 -b feature/​002-user-profile
git worktree add ../​project-worktrees/​pr-003 -b feature/​003-admin-panel

Verification: git worktree list should show all 3 worktrees

Benefits

✅ No Branch Switching: Work on multiple branches without git checkout ✅ Parallel Servers: Run multiple dev environments simultaneously ✅ Preserve State: Build artifacts and node_modules stay per-branch ✅ Safer Reviews: Test PRs without affecting main working directory ✅ Faster Context Switch: Jump between worktrees instead of rebasing

Related Skills

  • stacked-prs - Combine worktrees with stacked PR workflow
  • git-workflow - General git branching patterns
  • code-review - Review code in isolated worktrees