# Git Worktree

> Manage git worktrees for parallel feature development Use when this capability is needed.

- Skill: `tomevault-io/git-worktree-10` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/git-worktree-10`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/git-worktree-10/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/git-worktree-10

---


# Git Worktree Management

I'll help you manage git worktrees for parallel development workflows.

Arguments: `$ARGUMENTS` - action (add/list/remove) and worktree name

## Worktree Philosophy

Based on **obra/superpowers** parallel development patterns:
- Work on multiple features simultaneously
- Keep main worktree clean
- Isolate experimental branches
- Quick context switching
- No stashing required

## Token Optimization

This skill uses efficient bash-based operations to minimize token usage:

### 1. Worktree List Caching (400 token savings)
**Pattern:** Cache worktree list instead of repeated git commands
- Store `git worktree list` output in `.worktree-cache` (5 min TTL)
- Cache includes: paths, branches, commit hashes
- Read cached list for status checks (50 tokens vs 450 tokens fresh)
- Invalidate on add/remove operations
- **Savings:** 88% on list operations, most common action

### 2. Bash-Only Operations (1,200 token savings)
**Pattern:** Use pure bash/git commands, no Task agents
- All operations via direct git worktree commands
- No file exploration or codebase analysis needed
- Simple grep/awk for parsing git output
- No Task tool overhead
- **Savings:** 85% vs Task-based implementations

### 3. Early Exit for List-Only Operations (90% savings)
**Pattern:** Detect list requests and return cached data
- List operations are 60% of all worktree commands
- Return cached worktree list immediately (100 tokens)
- No git status checks, no uncommitted change scans
- Full status only if explicitly requested
- **Savings:** 100 vs 1,500 tokens for simple list requests

### 4. Minimal Validation (500 token savings)
**Pattern:** Trust git's built-in validation
- Don't pre-validate branch existence (git does this)
- Skip disk space checks (rarely an issue)
- No pre-flight conflict detection
- Let git worktree commands fail gracefully
- **Savings:** 70% vs exhaustive pre-validation

### 5. Status Check Sampling (300 token savings)
**Pattern:** Check only current worktree, not all worktrees
- When showing status, check active worktree only
- Don't cd into every worktree for uncommitted changes
- Full status scan only for prune operations
- **Savings:** 75% vs comprehensive status checks

### 6. Template-Based Instructions (200 token savings)
**Pattern:** Show minimal command output
- Display worktree path and `cd` command only
- Don't repeat methodology or best practices
- User knows worktree concepts after first use
- Detailed help only on errors
- **Savings:** 80% vs full workflow explanations

### 7. Grep-Based Worktree Detection (250 token savings)
**Pattern:** Use grep to find worktrees by name
- Parse `git worktree list` with grep/awk (100 tokens)
- Don't use Task agents to search for worktrees
- Simple pattern matching for validation
- **Savings:** 85% vs Task-based search

### Real-World Token Usage Distribution

**Typical operation patterns:**
- **List worktrees** (cached): 100 tokens
- **Add worktree** (new branch): 800 tokens
- **Remove worktree** (with checks): 600 tokens
- **Prune worktrees**: 400 tokens
- **Status check** (cached): 150 tokens
- **Most common:** List operations with cached data

**Expected per-operation:** 1,500-2,500 tokens (50% reduction from 3,000-5,000 baseline)
**Real-world average:** 500 tokens (due to caching, list-heavy usage, minimal validation)

## Pre-Flight Checks

Before managing worktrees, I'll verify:
- Git repository exists and is valid
- No uncommitted changes in current worktree
- Sufficient disk space available
- Target branch exists (for checkout)

<think>
Worktree Strategy:
- What's the purpose of this worktree?
- Should it be a new or existing branch?
- Where should it be located?
- How to handle cleanup?
</think>

First, let me check your current worktree setup:

```bash
#!/bin/bash
# Check current worktree configuration

set -e

echo "=== Git Worktree Status ==="
echo ""

# 1. Verify git repository
if ! git rev-parse --git-dir > /dev/null 2>&1; then
    echo "Error: Not a git repository"
    exit 1
fi

# 2. Show main repository location
echo "Main Repository:"
git rev-parse --git-dir
echo ""

# 3. List existing worktrees
echo "Existing Worktrees:"
if git worktree list > /dev/null 2>&1; then
    git worktree list
else
    echo "  None (git worktree not supported)"
    exit 1
fi
echo ""

# 4. Show current worktree
echo "Current Worktree:"
current_worktree=$(git rev-parse --show-toplevel)
current_branch=$(git branch --show-current)
echo "  Location: $current_worktree"
echo "  Branch: $current_branch"
echo ""

# 5. Check for uncommitted changes
echo "Status:"
if git diff --quiet && git diff --cached --quiet; then
    echo "  ✓ No uncommitted changes"
else
    echo "  ⚠ Uncommitted changes present"
    git status --short
fi
echo ""
```

## Action: Add Worktree

Create a new worktree for parallel development:

```bash
#!/bin/bash
# Add new git worktree

add_worktree() {
    local worktree_name="$1"
    local branch_name="$2"
    local base_branch="${3:-main}"

    echo "=== Add Git Worktree ==="
    echo ""

    # Validate inputs
    if [ -z "$worktree_name" ]; then
        echo "Error: Worktree name required"
        echo ""
        echo "Usage:"
        echo "  /git-worktree add feature-auth"
        echo "  /git-worktree add bugfix-login existing-branch"
        exit 1
    fi

    # Default branch name to worktree name
    branch_name="${branch_name:-$worktree_name}"

    # 1. Check if worktree already exists
    if git worktree list | grep -q "$worktree_name"; then
        echo "Error: Worktree '$worktree_name' already exists"
        echo ""
        echo "Existing worktrees:"
        git worktree list
        exit 1
    fi

    # 2. Determine worktree location
    repo_root=$(git rev-parse --show-toplevel)
    worktree_path="$repo_root/../$worktree_name"

    echo "Configuration:"
    echo "  Worktree: $worktree_name"
    echo "  Branch: $branch_name"
    echo "  Location: $worktree_path"
    echo ""

    # 3. Check if branch exists
    if git rev-parse --verify "$branch_name" > /dev/null 2>&1; then
        echo "Branch exists: $branch_name"
        echo "Creating worktree from existing branch..."
        git worktree add "$worktree_path" "$branch_name"
    else
        echo "Creating new branch: $branch_name"
        echo "Base: $base_branch"
        git worktree add -b "$branch_name" "$worktree_path" "$base_branch"
    fi

    echo ""
    echo "✓ Worktree created successfully"
    echo ""
    echo "Switch to worktree:"
    echo "  cd $worktree_path"
    echo ""
    echo "Or open in new terminal/editor"
}

# Parse arguments
action="${ARGUMENTS%% *}"
params="${ARGUMENTS#* }"

if [ "$action" = "add" ]; then
    add_worktree $params
fi
```

## Action: List Worktrees

Show all worktrees with detailed information:

```bash
#!/bin/bash
# List all git worktrees

list_worktrees() {
    echo "=== Git Worktrees ==="
    echo ""

    # 1. Get worktree list
    if ! git worktree list > /dev/null 2>&1; then
        echo "No worktrees found"
        return 0
    fi

    # 2. Show detailed information
    git worktree list | while read -r path commit branch; do
        echo "Worktree: $(basename "$path")"
        echo "  Path: $path"
        echo "  Branch: $branch"
        echo "  Commit: ${commit:0:8}"

        # Check for uncommitted changes
        if [ -d "$path" ]; then
            cd "$path" || continue
            if ! git diff --quiet || ! git diff --cached --quiet; then
                echo "  Status: ⚠ Uncommitted changes"
            else
                echo "  Status: ✓ Clean"
            fi
            cd - > /dev/null || true
        fi

        echo ""
    done

    # 3. Show prunable worktrees
    echo "Prunable Worktrees:"
    if git worktree prune --dry-run 2>&1 | grep -q "Removing"; then
        git worktree prune --dry-run
    else
        echo "  None"
    fi
    echo ""
}

if [ "$action" = "list" ] || [ -z "$action" ]; then
    list_worktrees
fi
```

## Action: Remove Worktree

Safely remove a worktree:

```bash
#!/bin/bash
# Remove git worktree

remove_worktree() {
    local worktree_name="$1"

    echo "=== Remove Git Worktree ==="
    echo ""

    if [ -z "$worktree_name" ]; then
        echo "Error: Worktree name required"
        echo ""
        echo "Usage:"
        echo "  /git-worktree remove feature-auth"
        exit 1
    fi

    # 1. Find worktree path
    worktree_path=$(git worktree list | grep "$worktree_name" | awk '{print $1}')

    if [ -z "$worktree_path" ]; then
        echo "Error: Worktree '$worktree_name' not found"
        echo ""
        echo "Available worktrees:"
        git worktree list
        exit 1
    fi

    echo "Worktree: $worktree_name"
    echo "Path: $worktree_path"
    echo ""

    # 2. Check for uncommitted changes
    if [ -d "$worktree_path" ]; then
        cd "$worktree_path" || exit 1

        if ! git diff --quiet || ! git diff --cached --quiet; then
            echo "⚠ Warning: Uncommitted changes detected"
            git status --short
            echo ""
            echo "Options:"
            echo "  1. Commit changes first"
            echo "  2. Force remove (changes will be lost)"
            echo ""
            read -p "Force remove? [y/N]: " confirm
            if [ "$confirm" != "y" ]; then
                echo "Remove cancelled"
                exit 0
            fi
        fi

        cd - > /dev/null || true
    fi

    # 3. Get branch name for optional deletion
    branch_name=$(git worktree list | grep "$worktree_name" | awk '{print $3}' | sed 's/\[//' | sed 's/\]//')

    # 4. Remove worktree
    echo "Removing worktree..."
    git worktree remove "$worktree_path" --force

    echo "✓ Worktree removed"
    echo ""

    # 5. Ask about branch deletion
    if [ -n "$branch_name" ] && git rev-parse --verify "$branch_name" > /dev/null 2>&1; then
        echo "Branch still exists: $branch_name"
        echo ""
        read -p "Delete branch too? [y/N]: " delete_branch
        if [ "$delete_branch" = "y" ]; then
            git branch -D "$branch_name"
            echo "✓ Branch deleted"
        else
            echo "Branch kept for future use"
        fi
    fi
}

if [ "$action" = "remove" ] || [ "$action" = "rm" ]; then
    remove_worktree $params
fi
```

## Action: Prune Worktrees

Clean up removed worktrees:

```bash
#!/bin/bash
# Prune deleted worktrees

prune_worktrees() {
    echo "=== Prune Git Worktrees ==="
    echo ""

    # 1. Check for prunable worktrees
    echo "Checking for orphaned worktrees..."
    if git worktree prune --dry-run 2>&1 | grep -q "Removing"; then
        echo ""
        git worktree prune --dry-run
        echo ""

        read -p "Prune these worktrees? [y/N]: " confirm
        if [ "$confirm" = "y" ]; then
            git worktree prune
            echo "✓ Worktrees pruned"
        else
            echo "Prune cancelled"
        fi
    else
        echo "  No orphaned worktrees found"
    fi
    echo ""
}

if [ "$action" = "prune" ]; then
    prune_worktrees
fi
```

## Action: Switch Worktree

Quick switch between worktrees:

```bash
#!/bin/bash
# Switch to worktree (helper)

switch_worktree() {
    local worktree_name="$1"

    echo "=== Switch Worktree ==="
    echo ""

    if [ -z "$worktree_name" ]; then
        echo "Available worktrees:"
        git worktree list
        exit 0
    fi

    # Find worktree path
    worktree_path=$(git worktree list | grep "$worktree_name" | awk '{print $1}')

    if [ -z "$worktree_path" ]; then
        echo "Error: Worktree '$worktree_name' not found"
        exit 1
    fi

    echo "Switching to: $worktree_name"
    echo "Path: $worktree_path"
    echo ""
    echo "Run this command to switch:"
    echo "  cd $worktree_path"
}

if [ "$action" = "switch" ]; then
    switch_worktree $params
fi
```

## Common Workflows

**Parallel Feature Development:**
```bash
# Main worktree: working on feature A
/git-worktree add feature-b
# Opens new worktree for feature B

# Work on both simultaneously
cd ../feature-b
# Make changes to feature B

# Return to main worktree
cd ../main-repo
# Continue feature A
```

**Bug Fix While Developing:**
```bash
# Currently working on feature
/git-worktree add hotfix-critical main
# Creates worktree from main branch

cd ../hotfix-critical
# Fix bug, test, commit

# Create PR, merge
# Return to feature work
cd ../main-repo

# Clean up
/git-worktree remove hotfix-critical
```

**Code Review in Separate Worktree:**
```bash
# Review PR without disrupting current work
/git-worktree add review-pr-123 pr-branch

cd ../review-pr-123
# Review, test, comment

# Clean up after review
cd ../main-repo
/git-worktree remove review-pr-123
```

## Safety Features

**Before Removing Worktree:**
- Check for uncommitted changes
- Warn if changes would be lost
- Require confirmation for force remove
- Option to delete or keep branch

**Before Adding Worktree:**
- Verify branch exists or create new
- Check disk space (optional)
- Prevent duplicate worktree names
- Use consistent naming

## Integration with /branch-finish

When completing work in a worktree:

```bash
# 1. Finish work in worktree
cd ../feature-x
/branch-finish

# 2. Return to main and clean up
cd ../main-repo
/git-worktree remove feature-x
```

## Directory Structure

**Recommended Structure:**
```
project/
├── main-repo/           # Main worktree
│   └── .git/
├── feature-auth/        # Feature worktree
├── feature-payments/    # Another feature
└── bugfix-login/        # Bugfix worktree
```

**Alternative (subdirectory):**
```
project/
├── main/               # Main worktree
│   └── .git/
└── worktrees/          # All additional worktrees
    ├── feature-auth/
    ├── feature-payments/
    └── bugfix-login/
```

## Worktree Best Practices

**When to Use Worktrees:**
- ✅ Working on multiple features simultaneously
- ✅ Quick hotfixes without stashing
- ✅ Code reviews without branch switching
- ✅ Testing different approaches in parallel
- ✅ Maintaining multiple versions

**When NOT to Use Worktrees:**
- ❌ Simple branch switching (use `git checkout`)
- ❌ Temporary experiments (use stash)
- ❌ Single-feature development
- ❌ Limited disk space

## Cleanup Strategy

**Regular Cleanup:**
```bash
# Weekly: prune deleted worktrees
/git-worktree prune

# Monthly: review all worktrees
/git-worktree list

# Remove completed worktrees
/git-worktree remove <name>
```

## Error Handling

If worktree operations fail:
- I'll explain the error clearly
- Show current worktree state
- Provide recovery options
- Ensure no partial operations

**Common Errors:**
- **Branch locked**: Another worktree using branch
- **Path exists**: Directory conflict
- **Uncommitted changes**: Require commit or force
- **Not a repository**: Must be in git repo

## What I'll Actually Do

1. **List Worktrees** - Show all worktrees with status
2. **Add Worktree** - Create new worktree with branch
3. **Remove Worktree** - Safely delete worktree
4. **Prune** - Clean up orphaned worktrees
5. **Status Check** - Show uncommitted changes
6. **Switch Helper** - Generate cd commands

**Important:** I will NEVER:
- Remove worktrees without checking for uncommitted work
- Create duplicate worktrees
- Leave orphaned worktrees
- Modify git config
- Add AI attribution

Worktree management will be safe, clean, and efficient for parallel development.

**Credits:** Worktree workflow based on [obra/superpowers](https://github.com/obra/superpowers) parallel development patterns and git worktree best practices.

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/manastalukdar) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-13 -->

