Manage git worktrees with GitFlow conventions for parallel development.
Manage git worktrees following GitFlow conventions, enabling parallel development workflows. Create, list, switch between, and clean up worktrees with standardized naming and directory structure. Pure Git implementation, works with any project.
Use this skill when:
1. Feature Branches
feature/{feature-name}main or developfeature/email-notifications, feature/user-dashboard2. Fix Branches
fix/{fix-name} or bugfix/{fix-name}main or developfix/login-timeout, bugfix/form-validation3. Hotfix Branches
hotfix/{hotfix-name}mainhotfix/security-patch, hotfix/data-corruption4. Release Branches (optional)
release/{version}developrelease/1.2.0, release/v2.0.0-betaGood Names:
feature/email-notifications ✅feature/user-profile-page ✅fix/timeout-error ✅Bad Names:
feature/new-stuff ❌feature/email notifications ❌feature/implement-email-notifications-with-microsoft-graph-for-form-submissions ❌Worktrees are created in a sibling directory to the main repository:
project-root/ ← Main repository
project-root-worktrees/ ← Worktree parent directory
├── feature/
│ ├── email-notifications/ ← Worktree for feature/email-notifications
│ └── user-dashboard/ ← Worktree for feature/user-dashboard
├── fix/
│ └── login-timeout/ ← Worktree for fix/login-timeout
└── hotfix/
└── security-patch/ ← Worktree for hotfix/security-patch
Rationale:
Given repository at /path/to/my-project:
/path/to/my-project/path/to/my-project-worktreesExample:
/d/bovis-creation-forms/d/bovis-creation-forms-worktreesCommand:
# Usage: create-worktree <type> <name> [base-branch]
# Types: feature, fix, hotfix, release
# Name: descriptive name (kebab-case)
# Base: main, develop, etc. (default: main)
Examples:
# Create feature worktree
create-worktree feature email-notifications
# Result:
# - Branch: feature/email-notifications
# - Worktree: ../my-project-worktrees/feature/email-notifications/
# Create fix worktree from develop
create-worktree fix login-timeout develop
# Result:
# - Branch: fix/login-timeout (from develop)
# - Worktree: ../my-project-worktrees/fix/login-timeout/
Steps Performed:
{type}/{name}Script: scripts/create_worktree.sh
Command:
# List all worktrees
list-worktrees
# Output:
# Main: /d/bovis-creation-forms [main]
# Worktrees:
# 1. feature/email-notifications → ../bovis-creation-forms-worktrees/feature/email-notifications
# 2. fix/login-timeout → ../bovis-creation-forms-worktrees/fix/login-timeout
Information Displayed:
Script: scripts/list_worktrees.sh
Manual Switch:
# Option 1: Change directory
cd ../project-worktrees/feature/email-notifications
# Option 2: Open in new terminal/IDE
code ../project-worktrees/feature/email-notifications
Note: Worktrees are independent directories. No special "switch" command needed, just cd to the path.
When to Remove:
Command:
# Remove specific worktree
remove-worktree feature/email-notifications
# Or use git directly
git worktree remove ../project-worktrees/feature/email-notifications
Script: Part of scripts/cleanup_worktrees.sh
What are Stale Worktrees?
Command:
# Clean up stale worktrees
cleanup-worktrees
# Options:
# --merged: Remove worktrees for merged branches
# --stale: Remove worktree registrations for deleted directories
# --dry-run: Show what would be removed
Steps Performed:
Script: scripts/cleanup_worktrees.sh
A git worktree is a linked working tree that allows you to have multiple branches checked out simultaneously.
Without Worktrees:
project/ ← Only one branch at a time
(on main) ← Must switch branches, stash changes
With Worktrees:
project/ ← Main worktree (main branch)
project-worktrees/
feature/
email-notif/ ← feature/email-notifications branch
fix/
login-timeout/ ← fix/login-timeout branch
Each worktree is independent, allowing simultaneous work.
✅ Parallel Development: Work on multiple features simultaneously
✅ No Stashing: Each worktree has its own working directory
✅ Fast Switching: Just cd to different directory
✅ Isolated Builds: Build artifacts don't interfere
✅ Team Collaboration: Easy to share specific feature states
Core Commands Used:
# Create worktree
git worktree add <path> -b <branch>
# List worktrees
git worktree list
# Remove worktree
git worktree remove <path>
# Prune stale worktree entries
git worktree prune
Start Feature:
# Create worktree
create-worktree feature email-notifications
cd ../bovis-worktrees/feature/email-notifications
Implement:
# Make changes, commit
git add .
git commit -m "Implement email service"
git push -u origin feature/email-notifications
Complete:
# Create PR, get merged
# Switch back to main worktree
cd /d/bovis-creation-forms
# Clean up
cleanup-worktrees --merged
Scenario: Working on 3 features simultaneously
# Developer A
create-worktree feature email-notifications
cd ../proj-worktrees/feature/email-notifications
# [work on feature A]
# Developer A (or B)
create-worktree feature user-dashboard
cd ../proj-worktrees/feature/user-dashboard
# [work on feature B]
# Developer C
create-worktree fix login-timeout
cd ../proj-worktrees/fix/login-timeout
# [work on fix]
All three can progress independently without conflicts.
Don't mix multiple features in one worktree. Keep focused.
Clean up merged worktrees regularly to avoid clutter:
# Weekly cleanup
cleanup-worktrees --merged
Use clear, descriptive names:
feature/real-time-notificationsfeature/stuffAlways commit or stash before switching worktrees (though each is independent):
git add .
git commit -m "WIP: partial implementation"
Push worktree branches to remote for backup:
git push -u origin feature/my-feature
Use main worktree for stable work, use feature worktrees for active development.
Cause: Branch already has a worktree
Solution:
# List worktrees to find existing one
git worktree list
# Use existing worktree or remove it first
git worktree remove <path>
Cause: Branch name conflicts with existing branch
Solution:
# Choose different name or delete old branch
git branch -d feature/old-name
# Or use existing branch
git worktree add <path> feature/existing-name
Cause: Uncommitted changes in worktree
Solution:
# Commit changes
cd <worktree-path>
git add .
git commit -m "Final changes"
# Or stash
git stash
# Then remove
git worktree remove <path>
Cause: Worktree directory deleted manually without git worktree remove
Solution:
# Prune stale worktree entries
git worktree prune
# Create worktree at specific commit
git worktree add <path> -b <branch> <commit-hash>
# Checkout existing remote branch
git worktree add <path> existing-branch
# Create worktree in detached HEAD state
git worktree add <path> <commit-hash>
This skill implements a simplified GitFlow:
main
├── feature/A ──┐
├── feature/B ──┤
└── fix/C ───────┤
├──> merge to main
hotfix/D ────────┘
Standard Flow:
This skill is 100% generic:
# Project A
cd /path/to/project-a
create-worktree feature new-feature
# Project B
cd /path/to/project-b
create-worktree feature another-feature
# Both use same workflow and conventions
scripts/create_worktree.sh - Create worktree with GitFlow conventionsscripts/list_worktrees.sh - List all worktrees with statusscripts/cleanup_worktrees.sh - Clean up merged and stale worktreesreferences/gitflow-conventions.md - Complete GitFlow reference