AgentSkillsCN

worktree

管理 Git 工作树。适用于用户希望创建、列出、删除或切换工作树时使用。特别适合基于分支的开发工作流,在每个分支下都拥有独立的工作目录。

SKILL.md
--- frontmatter
name: worktree
description: Manage git worktrees. Use when user wants to create, list, delete, or switch worktrees. Helps with branch-based development workflows where each branch has its own working directory.

Git Worktree Management

Overview

Git worktrees create isolated working directories that share the same repository. Work on multiple branches simultaneously without stashing or switching.

Announce at start: "I'm using the worktree skill to manage git worktrees."

Quick Commands

bash
# Create worktree with new branch
git worktree add .worktrees/<name> -b <branch-name>

# Create worktree from existing branch
git worktree add .worktrees/<name> <existing-branch>

# List worktrees
git worktree list

# Remove worktree
git worktree remove .worktrees/<name>

# Prune stale worktrees
git worktree prune

Recommended Directory Structure

code
project/
├── .worktrees/           # Hidden, keeps project root clean
│   ├── feature-auth/     # Worktree for auth feature
│   ├── bugfix-login/     # Worktree for login fix
│   └── experiment-new-ui/ # Experimental work
├── .gitignore            # Must include .worktrees/
└── ... (main working tree)

Why .worktrees/:

  • Hidden (starts with dot)
  • Project-local (easy to find)
  • Clear naming convention

Setup Workflow

1. Detect Current Location

bash
# Check if already in a worktree
git rev-parse --is-inside-work-tree
git worktree list | grep "$(pwd)"

# Get main repo root
git rev-parse --show-toplevel

2. Verify .gitignore

CRITICAL: Before creating worktrees, ensure .worktrees/ is in .gitignore:

bash
# Check if already ignored
grep -q "^\.worktrees/$" .gitignore && echo "OK" || echo "MISSING"

# Add if missing
echo ".worktrees/" >> .gitignore
git add .gitignore
git commit -m "chore: add .worktrees to gitignore"

3. Create Worktree

bash
# Create directory if needed
mkdir -p .worktrees

# New branch from current HEAD
git worktree add .worktrees/<name> -b <branch-name>

# New branch from specific base
git worktree add .worktrees/<name> -b <branch-name> origin/main

# From existing remote branch
git fetch origin
git worktree add .worktrees/<name> origin/<branch-name>

4. Post-Creation Setup

Each worktree needs its own setup:

bash
cd .worktrees/<name>

# Node.js
yarn install  # or npm install

# Nuxt
npx nuxt prepare

# Python
pip install -r requirements.txt

# Rust
cargo build

Common Operations

List All Worktrees

bash
git worktree list
# Output:
# /path/to/project           abc1234 [main]
# /path/to/project/.worktrees/feature  def5678 [feature-branch]

Switch to Worktree

bash
cd .worktrees/<name>

Remove Worktree

bash
# Safe remove (checks for uncommitted changes)
git worktree remove .worktrees/<name>

# Force remove
git worktree remove --force .worktrees/<name>

# Also delete branch
git worktree remove .worktrees/<name>
git branch -d <branch-name>

Clean Up Stale References

bash
# Remove worktree info for deleted directories
git worktree prune

# Check what would be pruned
git worktree prune --dry-run

Move Worktree

bash
git worktree move .worktrees/<old-name> .worktrees/<new-name>

Branch Naming Conventions

PrefixUse CaseExample
feature/New featuresfeature/user-auth
bugfix/Bug fixesbugfix/login-crash
hotfix/Urgent fixeshotfix/security-patch
experiment/Experimental workexperiment/new-ui
refactor/Code refactoringrefactor/api-cleanup

Worktree directory mirrors branch:

  • Branch: feature/user-auth
  • Worktree: .worktrees/feature-user-auth

Integration with Development

Starting Feature Work

bash
# 1. Create worktree
git worktree add .worktrees/feature-x -b feature/x origin/main

# 2. Setup
cd .worktrees/feature-x
yarn install
npx nuxt prepare  # for Nuxt projects

# 3. Verify clean baseline
yarn test

Finishing Feature Work

bash
# 1. From worktree, push and create PR
git push -u origin feature/x

# 2. After merge, cleanup
cd /path/to/main/repo
git worktree remove .worktrees/feature-x
git branch -d feature/x

Parallel Development

Work on multiple features simultaneously:

bash
# Terminal 1 - Feature A
cd .worktrees/feature-a
yarn dev --port 3001

# Terminal 2 - Feature B
cd .worktrees/feature-b
yarn dev --port 3002

# Terminal 3 - Main
yarn dev --port 3000

Troubleshooting

"fatal: '<path>' is a worktree but..."

Branch is already checked out:

bash
# Check where branch is checked out
git worktree list | grep <branch-name>

# Use different branch name or remove existing worktree

"fatal: '<branch>' is already checked out"

bash
# Create new branch instead
git worktree add .worktrees/<name> -b <new-branch-name>

Worktree shows wrong branch

bash
# Check actual state
cd .worktrees/<name>
git status
git branch

# If corrupted, remove and recreate
git worktree remove .worktrees/<name>
git worktree add .worktrees/<name> -b <branch>

node_modules issues

Each worktree needs its own node_modules:

bash
# Never symlink node_modules between worktrees
cd .worktrees/<name>
rm -rf node_modules
yarn install

.nuxt not generating types

bash
cd .worktrees/<name>
rm -rf .nuxt
npx nuxt prepare

Quick Reference

TaskCommand
Create (new branch)git worktree add .worktrees/<name> -b <branch>
Create (existing branch)git worktree add .worktrees/<name> <branch>
Listgit worktree list
Removegit worktree remove .worktrees/<name>
Prune stalegit worktree prune
Movegit worktree move <old> <new>
Check if in worktreegit rev-parse --show-toplevel

Red Flags

Never:

  • Create worktrees without .worktrees/ in .gitignore
  • Share node_modules between worktrees
  • Check out same branch in multiple worktrees
  • Leave stale worktrees (prune regularly)

Always:

  • Use .worktrees/ directory (or ask user preference)
  • Run project setup after creating worktree
  • Verify baseline tests pass
  • Clean up worktrees after merging PRs