8.3 KiB
Git Worktree Automation Setup
This repository is configured to automatically create Git worktrees for new branches, allowing you to work on multiple branches simultaneously without switching contexts.
What Are Worktrees?
Git worktrees allow you to have multiple working directories (copies of your repo) checked out to different branches at the same time. This means:
- No need to stash or commit work when switching branches
- Run dev servers on multiple branches simultaneously
- Compare code across branches easily
- Keep your main branch clean while working on features
Automatic Worktree Creation
A Git hook (.git/hooks/post-checkout) is installed that automatically creates worktrees when you create a new branch from main:
# This will automatically create a worktree at ../canvas-website-feature-name
git checkout -b feature/new-feature
Worktree Location Pattern:
/home/jeffe/Github/
├── canvas-website/ # Main repo (main branch)
├── canvas-website-feature-name/ # Worktree for feature branch
└── canvas-website-bugfix-something/ # Worktree for bugfix branch
Manual Worktree Management
Use the worktree-manager.sh script for manual management:
List All Worktrees
./scripts/worktree-manager.sh list
Create a New Worktree
# Creates worktree for existing branch
./scripts/worktree-manager.sh create feature/my-feature
# Or create new branch with worktree
./scripts/worktree-manager.sh create feature/new-branch
Remove a Worktree
./scripts/worktree-manager.sh remove feature/old-feature
Clean Up All Worktrees (Keep Main)
./scripts/worktree-manager.sh clean
Show Status of All Worktrees
./scripts/worktree-manager.sh status
Navigate to a Worktree
# Get worktree path
./scripts/worktree-manager.sh goto feature/my-feature
# Or use with cd
cd $(./scripts/worktree-manager.sh goto feature/my-feature)
Help
./scripts/worktree-manager.sh help
Workflow Examples
Starting a New Feature
With automatic worktree creation:
# In main repo
cd /home/jeffe/Github/canvas-website
# Create and switch to new branch (worktree auto-created)
git checkout -b feature/terminal-tool
# Notification appears:
# 🌳 Creating worktree for branch: feature/terminal-tool
# 📁 Location: /home/jeffe/Github/canvas-website-feature-terminal-tool
# Continue working in current directory or switch to worktree
cd ../canvas-website-feature-terminal-tool
Manual worktree creation:
./scripts/worktree-manager.sh create feature/my-feature
cd $(./scripts/worktree-manager.sh goto feature/my-feature)
Working on Multiple Features Simultaneously
# Terminal 1: Main repo (main branch)
cd /home/jeffe/Github/canvas-website
npm run dev # Port 5173
# Terminal 2: Feature branch 1
cd /home/jeffe/Github/canvas-website-feature-auth
npm run dev # Different port
# Terminal 3: Feature branch 2
cd /home/jeffe/Github/canvas-website-feature-ui
npm run dev # Another port
# All running simultaneously, no conflicts!
Comparing Code Across Branches
# Use diff or your IDE to compare files
diff /home/jeffe/Github/canvas-website/src/App.tsx \
/home/jeffe/Github/canvas-website-feature-auth/src/App.tsx
# Or open both in VS Code
code /home/jeffe/Github/canvas-website \
/home/jeffe/Github/canvas-website-feature-auth
Cleaning Up After Merging
# After merging feature/my-feature to main
cd /home/jeffe/Github/canvas-website
# Remove the worktree
./scripts/worktree-manager.sh remove feature/my-feature
# Or clean all worktrees except main
./scripts/worktree-manager.sh clean
How It Works
Post-Checkout Hook
The .git/hooks/post-checkout script runs automatically after git checkout and:
- Detects if you're creating a new branch from
main - Creates a worktree in
../canvas-website-{branch-name} - Links the worktree to the new branch
- Shows a notification with the worktree path
Hook Behavior:
- ✅ Creates worktree when:
git checkout -b new-branch(from main) - ❌ Skips creation when:
- Switching to existing branches
- Already in a worktree
- Worktree already exists for that branch
- Not branching from main/master
Worktree Manager Script
The scripts/worktree-manager.sh script provides:
- User-friendly commands for worktree operations
- Colored output for better readability
- Error handling and validation
- Status reporting across all worktrees
Git Commands with Worktrees
Most Git commands work the same way in worktrees:
# In any worktree
git status # Shows status of current worktree
git add . # Stages files in current worktree
git commit -m "..." # Commits in current branch
git push # Pushes current branch
git pull # Pulls current branch
# List all worktrees (works from any worktree)
git worktree list
# Remove a worktree (from main repo)
git worktree remove feature/branch-name
# Prune deleted worktrees
git worktree prune
Important Notes
Shared Git Directory
All worktrees share the same .git directory (in the main repo), which means:
- ✅ Commits, branches, and remotes are shared across all worktrees
- ✅ One
git fetchorgit pullin main updates all worktrees - ⚠️ Don't delete the main repo while worktrees exist
- ⚠️ Stashes are shared (stash in one worktree, pop in another)
Node Modules
Each worktree has its own node_modules:
- First time entering a worktree: run
npm install - Dependencies may differ across branches
- More disk space usage (one
node_modulesper worktree)
Port Conflicts
When running dev servers in multiple worktrees:
# Main repo
npm run dev # Uses default port 5173
# In worktree, specify different port
npm run dev -- --port 5174
IDE Integration
VS Code:
# Open specific worktree
code /home/jeffe/Github/canvas-website-feature-name
# Or open multiple worktrees as workspace
code --add /home/jeffe/Github/canvas-website \
--add /home/jeffe/Github/canvas-website-feature-name
Troubleshooting
Worktree Path Already Exists
If you see:
fatal: '/path/to/worktree' already exists
Remove the directory manually:
rm -rf /home/jeffe/Github/canvas-website-feature-name
git worktree prune
Can't Delete Main Repo
If you have active worktrees, you can't delete the main repo. Clean up first:
./scripts/worktree-manager.sh clean
Worktree Out of Sync
If a worktree seems out of sync:
cd /path/to/worktree
git fetch origin
git reset --hard origin/branch-name
Hook Not Running
If the post-checkout hook isn't running:
# Check if it's executable
ls -la .git/hooks/post-checkout
# Make it executable if needed
chmod +x .git/hooks/post-checkout
# Test the hook manually
.git/hooks/post-checkout HEAD HEAD 1
Disabling Automatic Worktrees
To disable automatic worktree creation:
# Remove or rename the hook
mv .git/hooks/post-checkout .git/hooks/post-checkout.disabled
To re-enable:
mv .git/hooks/post-checkout.disabled .git/hooks/post-checkout
Advanced Usage
Custom Worktree Location
Modify the post-checkout hook to change the worktree location:
# Edit .git/hooks/post-checkout
# Change this line:
WORKTREE_BASE=$(dirname "$REPO_ROOT")
# To (example):
WORKTREE_BASE="$HOME/worktrees"
Worktree for Remote Branches
# Create worktree for remote branch
git worktree add ../canvas-website-remote-branch origin/feature-branch
# Or use the script
./scripts/worktree-manager.sh create origin/feature-branch
Detached HEAD Worktree
# Create worktree at specific commit
git worktree add ../canvas-website-commit-abc123 abc123
Best Practices
- Clean up regularly: Remove worktrees for merged branches
- Name branches clearly: Worktree names mirror branch names
- Run npm install: Always run in new worktrees
- Check branch: Always verify which branch you're on before committing
- Use status command: Check all worktrees before major operations
Resources
Setup Complete! New branches will automatically create worktrees. Use ./scripts/worktree-manager.sh help for manual management.