Git Worktree Guide for Monorepo
Overview
Git worktree allows you to have multiple working directories attached to the same repository. This is particularly useful for the Magenta Design System monorepo where you might need to:
- Work on multiple features simultaneously
- Compare implementations across different branches
- Test changes against stable versions
- Review pull requests while continuing development
- Run different development servers for different packages
Why Use Git Worktree in Monorepos
Traditional Problems with Branch Switching
# Traditional workflow problems:
git checkout feature-branch-1 # Working on DatePicker component
# ... make changes, start dev server ...
git stash # Need to switch to review PR
git checkout main
git checkout pr-branch # Review someone's Button component
# ... now need to reinstall dependencies, restart servers ...
git checkout feature-branch-1 # Back to DatePicker work
git stash pop # Restore changes
# ... reinstall dependencies again, restart dev server ...Git Worktree Solution
# With worktree - much cleaner:
git worktree add ../feature1 feature-branch-1 # DatePicker work
git worktree add ../pr-review pr-branch # Review work
git worktree add ../hotfix hotfix-branch # Urgent fix
# Each directory maintains its own:
# - Node modules
# - Build artifacts
# - Development servers
# - Git stateBasic Git Worktree Commands
Creating Worktrees
# Create a new worktree for existing branch
git worktree add <path> <branch-name>
git worktree add ../feature feat/ASD-1234-datepicker-v2
# Create worktree with new branch
git worktree add -b <new-branch> <path> <start-point>
git worktree add -b feat/ASD-5678-button-redesign ../button develop
Managing Worktrees
# List all worktrees
git worktree list
# Remove a worktree (after deleting the directory)
git worktree remove <path>
# Prune deleted worktrees
git worktree prune
# Move a worktree to a different location
git worktree move <worktree> <new-path>Best Practices for Monorepo
1. Directory Structure Convention
Organize your worktrees in a predictable structure:
# Recommended structure:
~/Development/
├── develop/ # Main worktree (develop branch)
├── feature-1/ # Feature branch worktree
├── feature-2/ # Another feature branch
├── pr-review/ # For reviewing PRs
├── hotfix/ # For urgent fixes
└── experimental/ # For experimental work2. Naming Conventions
Current Repository Branch Naming:
The repository follows these branch naming patterns:
feat/ASD-XXXX-description- New featuresfix/ASD-XXXX-description- Bug fixeschore/ASD-XXXX-description- Maintenance tasksci/description- CI/CD related changesrelease/version- Release branches
Use descriptive names that reflect the purpose:
# Good naming examples (following current ASD ticket patterns):
git worktree add ../datepicker-v2 feat/ASD-1234-datepicker-v2
git worktree add ../pr-5678 fix/ASD-5678-button-accessibility
git worktree add ../hotfix-critical fix/ASD-5999-critical-css-bug
git worktree add ../docs-update chore/ASD-6000-component-guidelines3. Package Management Best Practices
Each worktree should maintain its own dependencies:
# After creating a new worktree:
cd ../feature-1
pnpm install # Install dependencies
pnpm build:packages # Build packages if needed4. Development Server Management
Run different dev servers for different purposes:
# In main worktree (port 6006 - Storybook):
cd ~/Development/develop
pnpm dev:docs
# In feature worktree (port 3000 - Next.js docs):
cd ~/Development/feature-1
pnpm dev:docs-v2
# In review worktree (specific package):
cd ~/Development/pr-review
pnpm dev:reactRecommended Workflow
1. Creating Feature Worktrees
# For new feature development
git worktree add -b feat/ASD-1234-new-component ../new-component develop
# Switch to the new worktree
cd ../new-component
# Install dependencies
pnpm install
# Start development
pnpm dev:docs3. PR Review Workflow
# Create worktree for PR review (GitHub PR #123)
git fetch origin pull/123/head:review/pr-123
git worktree add ../pr-123 review/pr-123
# Switch to review worktree
cd ../pr-123
pnpm install
pnpm build:packages
pnpm dev:docs
# Test the changes
pnpm test
pnpm test:coverage4. Hotfix Workflow
# Create hotfix worktree from develop (main branch)
git worktree add -b fix/ASD-9999-critical-fix ../hotfix develop
cd ../hotfix
pnpm install
# Make urgent fixes
# Test thoroughly
# Push and create PRCommon Scenarios
Scenario 1: Working on Multiple Components
# Main development - React components
git worktree add -b feat/ASD-1234-button-v2 ../button develop
# Parallel work - CSS system
git worktree add -b feat/ASD-1235-css-tokens ../css develop
# Documentation updates
git worktree add -b chore/ASD-1236-component-guide ../docs developScenario 2: Testing Cross-Package Dependencies
# Work on react-dates package
cd ~/Development/dates-feature
# Make changes to DatePicker
# Test in main docs without switching
cd ~/Development/
pnpm dev:docs # Will use built packages from dates-featureScenario 3: Comparing Implementations
# Keep current implementation running
cd ~/Development/
pnpm dev:docs # Running on localhost:6006
# Test new implementation
cd ~/Development/feature
pnpm dev:docs-v2 # Running on localhost:3000
# Compare side by side in browserTroubleshooting
Problem: Shared Lock Files
Issue: pnpm-lock.yaml conflicts between worktrees
Solution:
# Use separate lock files per worktree
cd ../feature
rm pnpm-lock.yaml
pnpm install # Creates new lock file
# Or use frozen lockfile
pnpm install --frozen-lockfileProblem: Node Modules Conflicts
Issue: Different package versions between worktrees
Solution:
# Clean and reinstall in each worktree
cd ../feature
rm -rf node_modules
pnpm install
pnpm build:packagesProblem: Port Conflicts
Issue: Multiple dev servers trying to use same port
Solution:
# Use different ports for different worktrees
PORT=3001 pnpm dev:docs-v2
PORT=6007 pnpm dev:docs
# Or modify package.json scripts temporarilyProblem: Git State Confusion
Issue: Changes in one worktree affecting others
Solution:
# Check worktree status
git worktree list
# Ensure each worktree is on correct branch
git branch -vv
# Use git status to check clean state
git statusAdvanced Tips
1. Automate Worktree Creation
Create a helper script:
#!/bin/bash
# create-worktree.sh
BRANCH_NAME=$1
WORKTREE_NAME=${2:-$BRANCH_NAME}
BASE_BRANCH=${3:-develop}
git worktree add -b $BRANCH_NAME ../$WORKTREE_NAME $BASE_BRANCH
cd ../$WORKTREE_NAME
pnpm install
echo "Worktree created: ../$WORKTREE_NAME"
echo "Branch: $BRANCH_NAME"
echo "Run: cd ../$WORKTREE_NAME && pnpm dev:docs"Usage:
./create-worktree.sh feat/ASD-1234-new-component new-component2. Shared Build Cache
For faster builds across worktrees:
# In each worktree, use shared Turbo cache
export TURBO_CACHE_DIR="$HOME/.turbo-cache"
# Or modify turbo.json to use absolute cache path3. IDE Configuration
For VS Code with multiple worktrees:
# Open multiple VS Code instances
code ~/Development/magenta # Main development
code ~/Development/feature # Feature work
code ~/Development/review # PR review4. Cleanup Script
Regular maintenance:
#!/bin/bash
# cleanup-worktrees.sh
echo "Current worktrees:"
git worktree list
echo "Pruning deleted worktrees:"
git worktree prune
echo "Cleaning up merged branches:"
# Add logic to remove worktrees for merged branches5. Package Linking for Development
When working on interdependent packages:
# In the package you're developing
cd packages/react
pnpm build
# Link to another worktree for testing
cd ../../../test-worktree
pnpm link ../dev-worktree/packages/reactPerformance Considerations
Disk Space Management
- Each worktree duplicates working files but shares Git objects
- Monitor disk usage:
du -sh ../* - Remove unused worktrees regularly
- Use
git worktree pruneto clean up
Memory Usage
- Multiple dev servers consume significant memory
- Consider running only necessary servers
- Use
pnpm dev:packagesvspnpm devstrategically
Network Efficiency
- Share
node_moduleswhen possible using pnpm’s store - Use
pnpm install --offlinewhen packages haven’t changed
Conclusion
Git worktree is a powerful tool for managing the complexity of the Magenta monorepo. By following these best practices, you can:
- Work on multiple features simultaneously without context switching
- Review PRs without disrupting your development environment
- Test changes across different package versions
- Maintain cleaner Git history with focused commits
Remember to regularly clean up unused worktrees and maintain good naming conventions to keep your development environment organized and efficient.