24 KiB
Git Worktree Guide - Comprehensive Reference
Complete guide to git worktrees with AI metadata integration for optimal development workflows.
Table of Contents
- Overview
- Core Concepts
- Mode Semantics Deep Dive
- Naming Conventions
- Workflow Patterns
- Metadata Files
- Organization Strategies
- Team Collaboration
- Troubleshooting
- Advanced Topics
Overview
What Are Git Worktrees?
Git worktrees allow you to check out multiple branches simultaneously in separate directories, all connected to the same repository. This eliminates the need to git stash or switch branches when context-switching.
Traditional Workflow:
# Working on feature
git checkout feature/user-auth
# ... work ...
# Need to fix bug
git stash
git checkout main
# ... fix bug ...
# Back to feature
git checkout feature/user-auth
git stash pop
Worktree Workflow:
# Create worktrees once
/working-tree:new feature/user-auth
/working-tree:new main --mode main
# Switch by changing directories
cd ../myapp-feature-user-auth # Feature work
cd ../myapp # Bug fix
# No stashing needed!
AI Metadata Integration
Each worktree has .ai-context.json that tells AI tools:
- What kind of work is being done (mode)
- Purpose of the worktree (description)
- When it was created
- Which branch it tracks
This allows AI to:
- Adjust suggestion style (conservative for
main, aggressive forexperiment) - Understand context automatically
- Provide relevant warnings
- Suggest appropriate tools
Core Concepts
Worktree Structure
Parent directory/
├── myapp/ # Main repository (or a worktree)
│ ├── .git/ # Git metadata (worktrees link here)
│ ├── .ai-context.json # AI metadata
│ └── README.working-tree.md # Human-readable info
│
├── myapp-feature-user-auth/ # Feature worktree
│ ├── .git → ../myapp/.git/ # Links to main .git
│ ├── .ai-context.json
│ └── README.working-tree.md
│
└── myapp-bugfix-timeout/ # Bugfix worktree
├── .git → ../myapp/.git/
├── .ai-context.json
└── README.working-tree.md
Metadata Files
.ai-context.json (Machine-Readable)
- JSON format
- Read by AI tools automatically
- Contains: worktree, branch, mode, created, description
README.working-tree.md (Human-Readable)
- Markdown format
- Documentation for developers
- Contains: mode semantics, paths, purpose
Mode Semantics Deep Dive
main - Production Stability
Philosophy: This is production-ready code. Changes must be minimal, tested, and safe.
Use Cases:
- Production hotfixes
- Critical security patches
- Emergency bug fixes
- Stable baseline for comparisons
Restrictions:
- No experimental changes
- No refactoring unless necessary for fix
- Minimal scope
- Full test coverage required
AI Behavior:
- Conservative suggestions
- Focuses on safety
- Warns about risks
- Suggests defensive code
- Recommends extensive testing
Example:
/working-tree:new main --mode main --description "Production baseline for hotfixes"
Workflow:
cd ../myapp-main
# Critical bug found in production
git pull origin main
# Make minimal surgical fix
git commit -m "fix: critical security vulnerability in auth"
git push origin main
# Deploy immediately
feature - Active Development
Philosophy: This is where real work happens. Experiment, iterate, and improve.
Use Cases:
- New features
- Enhancements to existing features
- Refactoring
- Performance improvements
- Most day-to-day work
Restrictions:
- None! Be creative
- Can make breaking changes
- Can refactor extensively
- Can add dependencies
AI Behavior:
- Helpful and proactive
- Suggests improvements freely
- Offers refactoring ideas
- Recommends best practices
- Encourages good patterns
Example:
/working-tree:new feature/user-dashboard --mode feature --description "New user settings dashboard with profile management"
Workflow:
cd ../myapp-feature-user-dashboard
# Develop freely
npm install new-library
# Refactor as needed
# Add tests
# Iterate until ready
git push origin feature/user-dashboard
# Create PR when ready
bugfix - Surgical Precision
Philosophy: Fix one specific bug without touching anything else.
Use Cases:
- Specific bug fixes
- Regression fixes
- Issue resolution
- Targeted corrections
Restrictions:
- Minimal scope (only fix the bug)
- No "while I'm here" changes
- No refactoring (unless required for fix)
- No new features
AI Behavior:
- Focused on the specific issue
- Warns about scope creep
- Suggests minimal changes
- Recommends adding tests for the bug
- Keeps changes isolated
Example:
/working-tree:new bugfix/session-timeout --mode bugfix --description "Fix session timeout not respecting user settings (issue #427)"
Workflow:
cd ../myapp-bugfix-session-timeout
# Reproduce the bug
# Write test that fails
# Fix minimal code to make test pass
# Verify no other changes
git diff # Should show minimal changes
git push origin bugfix/session-timeout
experiment - Prototype Freely
Philosophy: This might get thrown away. Optimize for learning, not production quality.
Use Cases:
- Proof of concepts
- Technology spikes
- Architecture exploration
- A/B testing approaches
- Learning new libraries
Restrictions:
- None - can be messy
- Don't worry about code quality
- Tests optional
- Can break conventions
AI Behavior:
- Aggressive with suggestions
- OK with rough code
- Suggests quick solutions
- Encourages trying things
- Less concerned with best practices
Example:
/working-tree:new exp/graphql-migration --mode experiment --description "Spike: evaluate GraphQL migration feasibility"
Workflow:
cd ../myapp-exp-graphql-migration
# Try things quickly
# Don't worry about polish
# Document learnings
# If successful → create feature worktree for proper implementation
# If failed → /working-tree:destroy and document why
review - Analytical Mindset
Philosophy: Read and analyze code without modifying production code.
Use Cases:
- Code review (PRs)
- Security audits
- Documentation work
- Performance analysis
- Understanding unfamiliar code
Restrictions:
- Read-only mindset (changes OK for docs/tests)
- No production code modification
- Analysis and documentation only
AI Behavior:
- Analytical and critical
- Points out issues
- Suggests improvements (for author to implement)
- Focuses on understanding
- Explains complex code
Example:
/working-tree:new review/pr-543 --mode review --description "Review authentication refactor PR #543"
Workflow:
cd ../myapp-review-pr-543
git fetch origin pull/543/head:review/pr-543
git checkout review/pr-543
# Read and analyze
# Add review comments
# Test changes
# Approve or request changes in PR
# When done → /working-tree:destroy
Naming Conventions
Structure Pattern
Format: <repo-name>-<type>-<description>
Examples:
myapp-feature-user-authmyapp-bugfix-session-timeoutmyapp-exp-graphql-spikeapi-server-feature-rate-limiting
Prefix Indicators
Use branch prefixes to auto-infer modes:
feature/→ mode: featurebugfix/orfix/→ mode: bugfixexp/orexperiment/→ mode: experimentreview/→ mode: reviewmainormaster→ mode: main
Best Practices
DO:
- Use lowercase with hyphens:
user-auth✅ - Be descriptive:
feature/oauth2-integration✅ - Include issue numbers:
bugfix/issue-427-timeout✅ - Use consistent prefixes:
feature/,bugfix/,exp/✅
DON'T:
- Use generic names:
test,temp,new❌ - Use spaces or special chars:
user auth,user_auth❌ - Be vague:
fix-bug,feature-1❌ - Mix naming styles ❌
Workflow Patterns
Pattern 1: Feature Development
Scenario: Developing a new feature over several days/weeks
Setup:
/working-tree:new feature/user-dashboard --mode feature --description "User settings dashboard with profile editing"
Workflow:
# Day 1: Setup
cd ../myapp-feature-user-dashboard
npm install needed-packages
git commit -m "feat: initial dashboard setup"
# Day 2-5: Development
# Work iteratively, commit frequently
git commit -m "feat: add profile form"
git commit -m "feat: add settings panel"
# Day 6: Review
git push origin feature/user-dashboard
# Create PR
# After merge
cd ../myapp
/working-tree:destroy ../myapp-feature-user-dashboard
Pattern 2: Parallel Feature Work
Scenario: Working on multiple features simultaneously
Setup:
/working-tree:new feature/api-v2 --description "New API endpoints"
/working-tree:new feature/ui-redesign --description "Frontend redesign"
/working-tree:new feature/user-auth --description "OAuth2 authentication"
Workflow:
# Morning: API work
cd ../myapp-feature-api-v2
# ... work on API ...
# Afternoon: UI work
cd ../myapp-feature-ui-redesign
# ... work on UI ...
# Context switching is instant - no git stash!
Management:
# Check status of all work
/working-tree:list
# See current worktree
/working-tree:status
Pattern 3: Urgent Hotfix During Feature Work
Scenario: Critical bug found while working on feature
Setup:
# Already working in feature worktree
cd ../myapp-feature-user-dashboard
# Urgent bug reported!
# Don't stash - just create bugfix worktree
cd ../myapp
/working-tree:new bugfix/critical-auth-flaw --mode bugfix
# Fix the bug
cd ../myapp-bugfix-critical-auth-flaw
# ... fix ...
git push origin bugfix/critical-auth-flaw
# Back to feature work
cd ../myapp-feature-user-dashboard
# Continue where you left off - no stash pop needed!
Pattern 4: Deployment Environment Management
Scenario: Managing dev, staging, and production deployments
Setup:
/working-tree:new develop --mode feature --description "Development environment"
/working-tree:new staging --mode review --description "Staging for QA testing"
/working-tree:new production --mode main --description "Production deployment code"
Workflow:
# Deploy to dev
cd ../myapp-develop
git pull origin develop
npm install
npm run build
npm run deploy:dev
# When ready for staging
cd ../myapp-staging
git pull origin staging
npm install
npm run build
npm run deploy:staging
# After QA approval
cd ../myapp-production
git pull origin main
npm install
npm run build
npm run deploy:prod
Each environment has its own:
- Dependencies (node_modules)
- Build artifacts
- Configuration files (.env.dev, .env.staging, .env.prod)
Pattern 5: Code Review Workflow
Scenario: Reviewing PRs without disrupting current work
Setup:
# For each PR to review
/working-tree:new review/pr-<number> --mode review --description "Review PR #<number>: <title>"
Workflow:
# Create review worktree
cd ../myapp
/working-tree:new review/pr-543 --mode review
cd ../myapp-review-pr-543
# Fetch the PR branch
git fetch origin pull/543/head:review/pr-543
git checkout review/pr-543
# Review the code
# Run tests
npm test
# Check the changes
git diff main...review/pr-543
# Add review comments in GitHub
# When done
cd ../myapp
/working-tree:destroy ../myapp-review-pr-543
Metadata Files
.ai-context.json Structure
Format:
{
"worktree": "string - directory name",
"branch": "string - git branch name",
"mode": "main|feature|bugfix|experiment|review",
"created": "string - ISO 8601 UTC timestamp",
"description": "string - freeform purpose description"
}
Example:
{
"worktree": "myapp-feature-user-auth",
"branch": "feature/user-authentication",
"mode": "feature",
"created": "2025-11-23T10:30:00Z",
"description": "Implement OAuth2 and JWT authentication with refresh tokens"
}
Field Details:
-
worktree: Just the directory name (not full path)
- Example:
myapp-feature-user-auth - Used by AI to identify context
- Example:
-
branch: Full git branch name
- Example:
feature/user-authentication - Must match actual git branch
- Example:
-
mode: One of five modes
- Values:
main,feature,bugfix,experiment,review - Affects AI behavior significantly
- Values:
-
created: ISO 8601 timestamp in UTC
- Format:
YYYY-MM-DDTHH:MM:SSZ - Example:
2025-11-23T10:30:00Z - Timezone must be UTC (trailing Z)
- Format:
-
description: Freeform text
- Can be empty string
- Keep concise (one sentence ideal)
- Explain purpose, not implementation
README.working-tree.md Structure
Purpose: Human-readable documentation about the worktree
Auto-Generated Content:
- Worktree name and branch
- Mode and its semantics
- Creation timestamp
- Purpose/description
- Path information
- Mode reference guide
Example:
# Worktree: myapp-feature-user-auth
**Branch:** `feature/user-authentication`
**Mode:** `feature`
**Created:** 2025-11-23T10:30:00Z
## Purpose
Implement OAuth2 and JWT authentication with refresh tokens
## Mode Semantics
- **main**: Minimal changes, stable work only
- **feature**: Active development, larger changes allowed
- **bugfix**: Isolated, surgical fixes only
- **experiment**: Prototypes, large swings, unsafe changes allowed
- **review**: Documentation, analysis, audits
## About This Worktree
This directory is an independent Git worktree attached to the main repository.
- Main repo: /Users/joe/Code/myapp
- Worktree path: /Users/joe/Code/myapp-feature-user-auth
- Branch: feature/user-authentication
See `.ai-context.json` for machine-readable metadata.
Organization Strategies
Strategy 1: Feature-Centric (Recommended)
Philosophy: One worktree per active feature/task
Structure:
myapp/ # main repo (mode: main or feature)
myapp-feature-api-v2/ # mode: feature
myapp-feature-ui-refresh/ # mode: feature
myapp-bugfix-auth-leak/ # mode: bugfix
Best For:
- Small to medium teams
- Feature-driven development
- Agile workflows
- Parallel feature development
Commands:
/working-tree:adopt --mode main --description "Main repository"
/working-tree:new feature/api-v2
/working-tree:new feature/ui-refresh
/working-tree:new bugfix/auth-leak --mode bugfix
Strategy 2: Environment-Based
Philosophy: Permanent worktrees for each environment
Structure:
myapp-develop/ # mode: feature (develop branch)
myapp-staging/ # mode: review (staging branch)
myapp-production/ # mode: main (main branch)
myapp-feature-X/ # mode: feature (temporary feature work)
Best For:
- DevOps-heavy workflows
- Multiple deployment environments
- Configuration management
- Testing different versions
Commands:
/working-tree:new develop --mode feature --description "Development environment"
/working-tree:new staging --mode review --description "Staging for QA"
/working-tree:new main --mode main --description "Production code"
Strategy 3: Experimentation-Heavy
Philosophy: Many experiments, few stable features
Structure:
myapp/ # mode: main (stable baseline)
myapp-exp-approach-a/ # mode: experiment
myapp-exp-approach-b/ # mode: experiment
myapp-exp-new-framework/ # mode: experiment
Best For:
- Research projects
- Prototyping
- Technology evaluation
- Rapid experimentation
Commands:
/working-tree:adopt --mode main --description "Stable baseline for comparisons"
/working-tree:new exp/approach-a --mode experiment
/working-tree:new exp/approach-b --mode experiment
Strategy 4: Review-Focused
Philosophy: Code quality and review are primary
Structure:
myapp/ # mode: feature (main development)
myapp-review-pr-123/ # mode: review
myapp-review-pr-456/ # mode: review
myapp-review-security/ # mode: review (audit)
Best For:
- Open source maintainers
- Code review heavy workflows
- Security auditing
- Quality-focused teams
Commands:
/working-tree:new review/pr-123 --mode review --description "Review user auth PR"
/working-tree:new review/security-audit --mode review
Team Collaboration
Sharing Worktree Practices
Document Your Strategy:
Create WORKTREE-GUIDE.md in your repository:
# Our Worktree Strategy
## Naming Convention
- Feature: `<repo>-feature-<short-name>`
- Bugfix: `<repo>-bugfix-<issue-number>`
## Modes
- `main`: Production code only
- `feature`: All development work
- `bugfix`: Bug fixes only
## Workflow
1. Create feature worktree: `/working-tree:new feature/name`
2. Develop and commit
3. Push and create PR
4. After merge: `/working-tree:destroy ../path`
Team Conventions
Agree On:
- Naming patterns: Consistent prefixes
- Mode usage: When to use each mode
- Cleanup policy: When to destroy worktrees
- Metadata descriptions: Level of detail
Example Team Agreement:
## Team Worktree Standards
### Naming
- Always use branch name in directory: `myapp-<branch-name>`
- Replace slashes with hyphens: `feature/user-auth` → `feature-user-auth`
### Modes
- `feature` for all development
- `bugfix` for issue fixes only
- `main` reserved for production hotfixes
### Cleanup
- Destroy worktree immediately after PR merge
- Run `/working-tree:list` weekly to audit active worktrees
### Descriptions
- Always include issue number if applicable
- One sentence explaining purpose
CI/CD Integration
Worktree-Aware CI:
Each worktree can have its own CI configuration or environment:
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Read .ai-context.json to customize behavior
- name: Read worktree mode
run: |
MODE=$(jq -r '.mode' .ai-context.json || echo "feature")
echo "WORKTREE_MODE=$MODE" >> $GITHUB_ENV
# Skip certain checks for experiment mode
- name: Lint
if: env.WORKTREE_MODE != 'experiment'
run: npm run lint
# Always run tests
- name: Test
run: npm test
Troubleshooting
Issue: "Branch already has a worktree"
Symptom:
Error: Branch 'feature/login' already has a worktree at /path/to/worktree
Cause: Trying to create a second worktree for the same branch
Solution:
# Option 1: Use the existing worktree
cd /path/to/existing/worktree
# Option 2: Destroy old worktree first
/working-tree:destroy /path/to/old/worktree
/working-tree:new feature/login
# Option 3: Checkout different branch in main repo
cd /path/to/main/repo
git checkout different-branch
Issue: Metadata file is missing
Symptom: /working-tree:status shows "no metadata"
Solution:
# Add metadata to existing worktree
/working-tree:adopt --mode feature --description "Your description"
Issue: Uncommitted changes when destroying
Symptom: Want to remove worktree but have uncommitted work
Solution:
# Option 1: Commit changes
cd /path/to/worktree
git add .
git commit -m "Save work in progress"
/working-tree:destroy /path/to/worktree
# Option 2: Stash changes
cd /path/to/worktree
git stash
/working-tree:destroy /path/to/worktree
# Later: git stash pop (in main repo or another worktree)
# Option 3: Proceed anyway (DESTRUCTIVE)
/working-tree:destroy /path/to/worktree
# Will warn you, but can proceed
Issue: Too many worktrees
Symptom: Can't track all your worktrees
Solution:
# Audit all worktrees
/working-tree:list
# Identify completed work
# For each completed worktree:
/working-tree:destroy ../myapp-feature-completed-thing
# Clean up stale references
git worktree prune
Issue: Confused about which worktree to use
Symptom: Multiple worktrees, unclear which has what work
Solution:
# Check current worktree
/working-tree:status
# List all with descriptions
/working-tree:list
# Add better descriptions
/working-tree:adopt --description "Clear, specific purpose"
# Clean up unclear worktrees
/working-tree:destroy ../myapp-temp # Vague names
Issue: Metadata and branch don't match
Symptom: .ai-context.json shows wrong branch
Cause: Branch was changed after metadata creation
Solution:
# Re-adopt to update metadata
/working-tree:adopt --description "Updated description"
# This will regenerate metadata with correct branch
Advanced Topics
Worktree Best Practices Summary
Creation:
- ✅ Use descriptive names
- ✅ Always add descriptions
- ✅ Choose appropriate mode
- ✅ Use branch prefixes for auto-mode
Usage:
- ✅ Run
/working-tree:statuswhen starting work - ✅ Use
/working-tree:listto see all work - ✅ Keep modes consistent with work type
- ✅ Update descriptions if purpose changes
Cleanup:
- ✅ Destroy after PR merge
- ✅ Check for uncommitted changes first
- ✅ Run weekly audit with
/working-tree:list - ✅ Clean up experiment worktrees promptly
When NOT to Use Worktrees
Use Traditional Branches If:
- Only working on one thing at a time
- Rarely switch contexts
- Short-lived changes (< 1 hour)
- Very simple projects
Worktrees Add Overhead For:
- Single-file edits
- Quick typo fixes
- Documentation-only changes
- Projects with no parallel work
Performance Considerations
Disk Space:
- Each worktree duplicates working tree (not
.git) - Source code is duplicated, git history is shared
- For large repos, worktrees can use significant disk space
Build Artifacts:
- Each worktree has its own
node_modules/,target/, etc. - Can use significant disk space
- Consider sharing build cache if possible
Management:
- More worktrees = more to track
- Recommended max: 5-10 active worktrees
- Archive or destroy unused worktrees regularly
Integration with AI Tools
How AI Uses Metadata:
-
Context Understanding:
- Reads
.ai-context.jsonautomatically - Understands mode semantics
- Adjusts behavior accordingly
- Reads
-
Suggestion Style:
main: Conservative, safe suggestionsfeature: Helpful, proactivebugfix: Focused, minimal scopeexperiment: Aggressive, quick solutionsreview: Analytical, critical
-
Warnings and Checks:
main: Warns about any changesbugfix: Warns about scope creepexperiment: Minimal warningsreview: Suggests improvements
-
Tool Selection:
- Recommends appropriate tools based on mode
- Suggests testing strategies per mode
- Provides mode-appropriate examples
Quick Reference
Essential Commands
# Create new worktree with metadata
/working-tree:new <branch-name> [--mode <mode>] [--description "<text>"]
# List all worktrees with metadata
/working-tree:list
# Show current worktree metadata
/working-tree:status
# Add metadata to existing worktree
/working-tree:adopt [--mode <mode>] [--description "<text>"]
# Remove worktree (preserves branch)
/working-tree:destroy <worktree-path>
Mode Quick Reference
| Mode | Purpose | Restrictions | AI Behavior |
|---|---|---|---|
main |
Production code | Minimal changes only | Conservative |
feature |
Development | None | Helpful |
bugfix |
Bug fixes | Focused scope | Minimal scope |
experiment |
Prototypes | None | Aggressive |
review |
Code review | Read-only mindset | Analytical |
Metadata Template
{
"worktree": "directory-name",
"branch": "branch-name",
"mode": "feature",
"created": "2025-11-23T12:34:56Z",
"description": "Purpose of worktree"
}
Further Reading
- Git Worktree Official Docs:
git help worktree - Working Tree Consultant Agent: Invoke for strategic guidance
- Templates: See
templates/directory for copy-paste templates
Version: 1.0.0 Last Updated: 2025-11-23 Maintained by: Waypoint working-tree module