Agent skill
worktree-management
Use when managing git worktrees. Provides patterns for creation, cleanup, and branch naming.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/worktree-management
SKILL.md
Worktree Management
Standardized patterns for managing git worktrees across the development workflow. All commands that create or manage worktrees should use these patterns.
Purpose
Provides single source of truth for worktree operations, branch naming conventions, and cleanup strategies. Ensures consistent worktree management across all workflows and commands.
Branch Naming Convention
Convert feature descriptions to standardized branch names:
Rules
- Lowercase all text
- Replace spaces with hyphens (
-) - Remove special characters (except hyphens)
- Prefix with one of the 5 conventional branch types:
feature/for new features (default)bugfix/for bug fixes (if description contains "fix" or "bug")hotfix/for urgent production fixesrelease/for release preparationchore/for maintenance, docs, refactoring, test additions, and other non-feature work
Note: branch types are broader than conventional commit types (feat:, fix:, docs:, etc.).
Branches are temporary workspaces, so fewer categories suffice.
Examples
| Description | Branch Name |
|---|---|
| "add dark mode toggle" | feature/add-dark-mode-toggle |
| "fix authentication bug" | bugfix/authentication-bug |
| "Update documentation" | chore/update-documentation |
| "refactor API client" | chore/refactor-api-client |
Bash Pattern
# Generate branch name from description
DESCRIPTION="add dark mode toggle"
PREFIX="feature" # or "bugfix" if description contains "fix" or "bug"; "chore" for docs/refactor/test
BRANCH_NAME=$(echo "$DESCRIPTION" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9-')
BRANCH_NAME="${PREFIX}/${BRANCH_NAME}"
Worktree Path Structure
Branch names with slashes create nested directories, which is the intended behavior:
# Branch with slash creates nested structure
BRANCH="feature/my-feature"
# Creates: ~/git/repo-name/feature/my-feature/
Note: Slashes in branch names are preserved to maintain 1:1 mapping between branch names and directory structure.
Worktree Creation Pattern
Standard Worktree Path
All worktrees follow this structure:
~/git/{REPO_NAME}/{BRANCH_NAME}/
Example:
- Repo:
ai-assistant-instructions - Branch:
feature/add-dark-mode - Path:
~/git/ai-assistant-instructions/feature/add-dark-mode/
Creation Steps
-
Get repository name:
bashREPO_NAME=$(basename $(git rev-parse --show-toplevel)) -
Find main worktree path:
bashMAIN_PATH=$(git worktree list | head -1 | awk '{print $1}') -
Sync main branch:
bashcd "$MAIN_PATH" git switch main git fetch --all --prune git pull -
Create worktree:
bashWORKTREE_PATH=~/git/${REPO_NAME}/${BRANCH_NAME} mkdir -p "$(dirname "$WORKTREE_PATH")" git worktree add "$WORKTREE_PATH" -b "$BRANCH_NAME" main -
Verify:
bashcd "$WORKTREE_PATH" git status
Worktree Cleanup Pattern
Identify Stale Worktrees
Worktrees are stale if:
-
Branch is merged into main:
bashgit branch --merged main | grep -q "^ $BRANCH$" -
Remote branch deleted:
bashgit branch -r | grep -q "origin/$BRANCH" # If exit code is 1, remote branch is gone -
Branch shows as [gone]:
bashgit branch -vv | grep "\[gone\]"
Cleanup Steps
-
List all worktrees:
bashgit worktree list -
For each non-main worktree, check if stale using above criteria
-
Remove stale worktree:
bashgit worktree remove "$WORKTREE_PATH" -
Delete local branch (if merged or gone):
bashgit branch -d "$BRANCH_NAME" # Safe delete (merged only) # or git branch -D "$BRANCH_NAME" # Force delete -
Prune administrative files:
bashgit worktree prune
Main Branch Synchronization
Before creating worktrees or after cleanup, sync main:
# Find main worktree
MAIN_PATH=$(git worktree list | head -1 | awk '{print $1}')
cd "$MAIN_PATH"
# Ensure on main branch
git switch main
# Fetch and prune
git fetch --all --prune
# Pull latest
git pull
# Return to original directory
cd -
Common Patterns
Pattern 1: Check if Worktree Exists
WORKTREE_PATH=~/git/repo-name/feat_branch-name
if [ -d "$WORKTREE_PATH" ]; then
echo "Worktree already exists at $WORKTREE_PATH"
cd "$WORKTREE_PATH"
else
echo "Creating new worktree..."
# Use creation pattern above
fi
Pattern 2: List All Worktrees
git worktree list
# Output format:
# /path/to/main abc123 [main]
# /path/to/worktree-1 def456 [feature/feature-1]
# /path/to/worktree-2 ghi789 [bugfix/bug-fix]
Pattern 3: Get Current Worktree Branch
CURRENT_BRANCH=$(git branch --show-current)
Pattern 4: Validate Repository
git rev-parse --is-inside-work-tree
# Exit code 0 = valid git repo
# Exit code != 0 = not a git repo
Commands Using This Skill
-
/init-worktree- Primary worktree creation command -
/create-worktrees:create-worktrees- Create worktrees for all open PRs (plugin) -
/sync-main- Syncs main across worktrees -
/refresh-repo- Cleanup and sync workflow
Plugin Integration
For creating worktrees for all open PRs, use the create-worktrees plugin instead of manual creation:
/create-worktrees:create-worktrees
This plugin automatically:
- Fetches all open PRs via GitHub CLI
- Creates worktrees for each PR branch
- Handles branch names with slashes correctly
- Cleans up stale worktrees
Related Resources
- git-workflow-standards skill (in the git-standards plugin) - Worktree and branch policies
- create-worktrees plugin - Create worktrees for all open PRs
Troubleshooting
Issue: "fatal: '$WORKTREE_PATH' already exists"
Cause: Worktree directory exists but not registered with git
Solution:
# Remove the directory
rm -rf "$WORKTREE_PATH"
# Re-create using proper git worktree add command
Issue: "fatal: invalid reference: $BRANCH_NAME"
Cause: Branch name contains invalid characters
Solution: Use branch naming convention from this skill (alphanumeric and hyphens only)
Issue: Worktree shows as "prunable" in git worktree list
Cause: Worktree directory was deleted without using git worktree remove
Solution:
git worktree prune
Issue: Cannot remove worktree - "has changes"
Cause: Uncommitted changes in worktree
Solution:
# Commit or stash changes first
cd "$WORKTREE_PATH"
git stash
cd -
# Then remove
git worktree remove "$WORKTREE_PATH"
Best Practices
- Always sync main before creating new worktrees
- Preserve slashes in branch names - Directory nesting follows branch structure (e.g.,
feature/my-featurecreates~/git/repo/feature/my-feature/) - Clean regularly - Remove merged/gone worktrees to save disk space
- Never work on main - Always create a feature branch worktree
- One worktree per feature - Isolation prevents conflicts
- Verify before creating - Check if worktree already exists
- Prune after cleanup - Run
git worktree pruneafter removing worktrees
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?