Work with git worktrees for isolated parallel development. Use when starting feature work in isolation, when need separate workspace without branch switching, or when cleaning up worktrees after PR merge.
75
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Git worktrees create isolated workspaces sharing the same repository, allowing
work on multiple branches simultaneously without switching. Each worktree is a
separate directory with its own working tree, but they share the same .git
history.
| Action | Command |
|---|---|
| List worktrees | git worktree list |
| Create worktree | git worktree add <path> -b <branch> |
| Create from existing branch | git worktree add <path> <branch> |
| Remove worktree | git worktree remove <path> |
| Prune stale worktrees | git worktree prune |
# Create worktree with new branch
git worktree add .worktrees/my-feature -b feat/my-feature
# Or specify base branch
git worktree add .worktrees/my-feature -b feat/my-feature main# Check out existing remote branch
git worktree add .worktrees/pr-review origin/fix-bug
# Check out existing local branch
git worktree add .worktrees/hotfix hotfix/urgent-fixproject/
├── .git/ # Shared git history
├── .worktrees/ # Convention: keep worktrees here
│ ├── feature-a/ # First worktree
│ └── feature-b/ # Second worktree
└── src/ # Main worktree filesAfter creating a worktree, you typically need to:
cd .worktrees/my-feature
# Install dependencies
npm install # or pnpm install, yarn, etc.
# Copy any required env files
cp ../.env .env.local
# Verify setup
npm testNEVER remove a worktree with uncommitted changes without confirmation.
# Check for uncommitted changes first
git -C .worktrees/my-feature status --porcelain
# If empty, safe to remove
git worktree remove .worktrees/my-feature
# Delete the branch after merge (-d is safe, fails if not merged)
git branch -d feat/my-feature| PR Merged? | Uncommitted Changes? | Action |
|---|---|---|
| Yes | No | Safe to remove |
| Yes | Yes | Ask user - changes will be lost |
| No | No | Do NOT remove - work not preserved |
| No | Yes | Do NOT remove - active work |
# 1. Check if work is merged (if using GitHub)
gh pr list --head feat/my-feature --state merged
# 2. Check for uncommitted changes
git -C .worktrees/my-feature status --porcelain
# 3. Remove worktree (only if merged or confirmed with user)
git worktree remove .worktrees/my-feature
# 4. Delete branch
git branch -d feat/my-featureIf a worktree directory was deleted manually:
git worktree prune# Create worktree from PR branch
git fetch origin pull/123/head:pr-123
git worktree add .worktrees/pr-123 pr-123
# Review, test, then clean up
git worktree remove .worktrees/pr-123
git branch -D pr-123# Main work continues in project root
# Start new feature in worktree
git worktree add .worktrees/new-api -b feat/new-api
# Work on both simultaneously
code .worktrees/new-api # Opens new VS Code windowA branch can only be checked out in one worktree at a time:
# Find where branch is checked out
git worktree list
# Remove that worktree first, or use different branch# Force add if directory exists but isn't a worktree
git worktree add --force <path> <branch>If a worktree is locked (prevents accidental removal):
# Unlock it
git worktree unlock <path>
# Then remove
git worktree remove <path>6c56f35
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.