Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create isolated git worktrees for feature development without switching branches
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 116% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-17 | ✗→✓ | ▲ Improved | -14% | 0% |
Create isolated git worktrees for feature development without switching branches.
Core principle: Smart directory selection + symlink optimization + background verification = fast, reliable isolation.
Requires: Git 2.5.0+ (July 2015)
Companion commands: /git-worktree-status | /git-worktree-remove | /git-worktree-clean
.worktrees/ or worktrees/git worktree addnode_modules/ from main worktree| Flag | Effect | |------|--------| | --fast | Skip dependency install and baseline tests | | --isolated | Fresh node_modules install (no symlink) | | --skip-install | Skip dependency install, keep baseline tests |
bash# Auto-prefix based on naming convention # "auth" → "feat/auth" (default prefix) # "fix/login-bug" → kept as-is # "refactor/db-layer" → kept as-is # Accepted prefixes: feat/, fix/, refactor/, chore/, docs/, test/, perf/ # If no prefix → default to feat/ # Reject invalid characters echo "$BRANCH_NAME" | grep -qE '^[a-zA-Z0-9/_-]+$' || exit 1 # Check branch doesn't already exist git show-ref --verify --quiet "refs/heads/$BRANCH_NAME" && echo "Branch already exists" && exit 1
bash# 1. Check existing directories ls -d .worktrees 2>/dev/null # Preferred (hidden) ls -d worktrees 2>/dev/null # Alternative # 2. Check CLAUDE.md for preference grep -i "worktree.*director" CLAUDE.md 2>/dev/null # 3. Ask user if neither exists
If both exist: .worktrees/ wins.
For project-local directories:
bash# Check if directory in .gitignore grep -q "^\.worktrees/$" .gitignore || grep -q "^worktrees/$" .gitignore
If NOT in .gitignore:
Why critical: Prevents accidentally committing worktree contents.
bash# 1. Detect project name project=$(basename "$(git rev-parse --show-toplevel)") # 2. Create worktree with new branch git worktree add .worktrees/$BRANCH_NAME -b $BRANCH_NAME # 3. Navigate cd .worktrees/$BRANCH_NAME
Default behavior: Symlink node_modules from main worktree to avoid duplicate installs (~30s saved).
bash# Symlink node_modules (default, unless --isolated) if [ -d "../../node_modules" ] && [ ! "$ISOLATED" = true ]; then ln -s "$(cd ../.. && pwd)/node_modules" node_modules echo "Symlinked node_modules from main worktree" fi # With --isolated: fresh install if [ "$ISOLATED" = true ]; then pnpm install # or npm/yarn based on lockfile detection fi
When to use --isolated:
node_modules issuesbash# Node.js (if not symlinked) if [ -f package.json ] && [ ! -L node_modules ]; then pnpm install # Detect from lockfile: pnpm-lock.yaml / yarn.lock / package-lock.json fi # Rust if [ -f Cargo.toml ]; then cargo build; fi # Python if [ -f requirements.txt ]; then pip install -r requirements.txt; fi if [ -f pyproject.toml ]; then poetry install; fi # Go if [ -f go.mod ]; then go mod download; fi
Instead of blocking on full test suite, run verification in background:
bash# Create log directory mkdir -p .worktree-logs # Background type check (Node.js) if [ -f tsconfig.json ]; then npx tsc --noEmit > .worktree-logs/typecheck.log 2>&1 & echo "Type check running in background (check with /git-worktree-status)" fi # Background test run if [ -f package.json ]; then npx vitest run --reporter=json > .worktree-logs/tests.log 2>&1 & echo "Tests running in background (check with /git-worktree-status)" fi
With --fast: Skip all verification.
Worktree ready at <full-path>
Branch: feat/auth (created from main)
Dependencies: symlinked from main worktree
Background checks: type check + tests running
Check status: /git-worktree-status
Ready to implement <feature-name>After worktree creation, detect database provider and suggest isolation.
| Provider | Suggested Command | |----------|-------------------| | Neon | neonctl branches create --name <branch> --parent main | | PlanetScale | pscale branch create <db> <branch> | | Local Postgres | psql -c "CREATE SCHEMA <schema>;" | | Other | Manual setup or shared DB |
Example output:
Worktree created at .worktrees/feat/auth
DB Isolation: neonctl branches create --name feat-auth --parent main
Then update .env with new DATABASE_URL
Full guide: ../workflows/database-branch-setup.mdCritical for environment variables:
bash# .worktreeinclude (at project root) .env .env.local .env.development **/.claude/settings.local.json
Why: Without this, .env files won't be copied to worktrees.
| Scenario | Create Branch? | |----------|---------------| | Schema migrations | Yes | | Data model refactoring | Yes | | Bug fix (no schema change) | No | | Performance experiments | Yes |
See: Database Branch Setup Guide for complete workflows.
| Situation | Action | |-----------|--------| | .worktrees/ exists | Use it (verify .gitignore) | | worktrees/ exists | Use it (verify .gitignore) | | Both exist | Use .worktrees/ | | Neither exists | Check CLAUDE.md, then ask user | | Not in .gitignore | Add + commit immediately | | No branch prefix | Auto-prefix with feat/ | | Node.js project | Symlink node_modules by default | | --fast flag | Skip install + tests | | --isolated flag | Fresh node_modules install | | Neon detected | Suggest neonctl branches create | | PlanetScale detected | Suggest pscale branch create | | No .worktreeinclude | Create with .env pattern |
Skipping .gitignore verification
Assuming directory location
Installing full node_modules in every worktree
--isolated only when neededNot copying .env to worktree
.env to .worktreeincludeUsing shared database for schema changes
/git-worktree auth
/git-worktree fix/session-bug
/git-worktree feature/new-api --fast
/git-worktree refactor/db-layer --isolatedBranch name: $ARGUMENTS
Other measured skills in the registry, with their headline benchmark lift.