git-worktrees
Use when working on multiple branches simultaneously, context switching without stashing, reviewing PRs while developing, testing in isolation, or comparing implementations across branches - provides git worktree commands and workflow patterns for parallel development with multiple working directories.
What this skill does
# Git Worktrees ## Overview Git worktrees enable checking out multiple branches simultaneously in separate directories, all sharing the same repository. Create a worktree instead of stashing changes or cloning separately. **Core principle:** One worktree per active branch. Switch contexts by changing directories, not branches. ## Core Concepts | Concept | Description | |---------|-------------| | **Main worktree** | Original working directory from `git clone` or `git init` | | **Linked worktree** | Additional directories created with `git worktree add` | | **Shared `.git`** | All worktrees share same Git object database (no duplication) | | **Branch lock** | Each branch can only be checked out in ONE worktree at a time | | **Worktree metadata** | Administrative files in `.git/worktrees/` tracking linked worktrees | ## Quick Reference | Task | Command | |------|---------| | Create worktree (existing branch) | `git worktree add <path> <branch>` | | Create worktree (new branch) | `git worktree add -b <branch> <path>` | | Create worktree (new branch from ref) | `git worktree add -b <branch> <path> <start>` | | Create detached worktree | `git worktree add --detach <path> <commit>` | | List all worktrees | `git worktree list` | | Remove worktree | `git worktree remove <path>` | | Force remove worktree | `git worktree remove --force <path>` | | Move worktree | `git worktree move <old> <new>` | | Lock worktree | `git worktree lock <path>` | | Unlock worktree | `git worktree unlock <path>` | | Prune stale worktrees | `git worktree prune` | | Repair worktree links | `git worktree repair` | | Compare files between worktrees | `diff ../worktree-a/file ../worktree-b/file` | | Get one file from another branch | `git checkout <branch> -- <path>` | | Get partial file changes | `git checkout -p <branch> -- <path>` | | Cherry-pick a commit | `git cherry-pick <commit>` | | Cherry-pick without committing | `git cherry-pick --no-commit <commit>` | | Merge without auto-commit | `git merge --no-commit <branch>` | ## Essential Commands ### Create a Worktree ```bash # Create worktree with existing branch git worktree add ../feature-x feature-x # Create worktree with new branch from current HEAD git worktree add -b new-feature ../new-feature # Create worktree with new branch from specific commit git worktree add -b hotfix-123 ../hotfix origin/main # Create worktree tracking remote branch git worktree add --track -b feature ../feature origin/feature # Create worktree with detached HEAD (for experiments) git worktree add --detach ../experiment HEAD~5 ``` ### List Worktrees ```bash # Simple list git worktree list # Verbose output with additional details git worktree list -v # Machine-readable format (for scripting) git worktree list --porcelain ``` **Example output:** ``` /home/user/project abc1234 [main] /home/user/project-feature def5678 [feature-x] /home/user/project-hotfix ghi9012 [hotfix-123] ``` ### Remove a Worktree ```bash # Remove worktree (working directory must be clean) git worktree remove ../feature-x # Force remove (discards uncommitted changes) git worktree remove --force ../feature-x ``` ### Move a Worktree ```bash # Relocate worktree to new path git worktree move ../old-path ../new-path ``` ### Lock/Unlock Worktrees ```bash # Lock worktree (prevents pruning if on removable storage) git worktree lock ../feature-x git worktree lock --reason "On USB drive" ../feature-x # Unlock worktree git worktree unlock ../feature-x ``` ### Prune Stale Worktrees ```bash # Remove stale worktree metadata (after manual directory deletion) git worktree prune # Dry-run to see what would be pruned git worktree prune --dry-run # Verbose output git worktree prune -v ``` ### Repair Worktrees ```bash # Repair worktree links after moving directories manually git worktree repair # Repair specific worktree git worktree repair ../feature-x ``` ## Workflow Patterns ### Pattern 1: Feature + Hotfix in Parallel To fix a bug while feature work is in progress: ```bash # Create worktree for hotfix from main git worktree add -b hotfix-456 ../project-hotfix origin/main # Switch to hotfix directory, fix, commit, push cd ../project-hotfix git add . && git commit -m "fix: resolve critical bug #456" git push origin hotfix-456 # Return to feature work cd ../project # Clean up when done git worktree remove ../project-hotfix ``` ### Pattern 2: PR Review While Working To review a PR without affecting current work: ```bash # Fetch PR branch and create worktree git fetch origin pull/123/head:pr-123 git worktree add ../project-review pr-123 # Review: run tests, inspect code cd ../project-review # Return to work, then clean up cd ../project git worktree remove ../project-review git branch -d pr-123 ``` ### Pattern 3: Compare Implementations To compare code across branches side-by-side: ```bash # Create worktrees for different versions git worktree add ../project-v1 v1.0.0 git worktree add ../project-v2 v2.0.0 # Diff, compare, or run both simultaneously diff ../project-v1/src/module.js ../project-v2/src/module.js # Clean up git worktree remove ../project-v1 git worktree remove ../project-v2 ``` ### Pattern 4: Long-Running Tasks To run tests/builds in isolation while continuing development: ```bash # Create worktree for CI-like testing git worktree add ../project-test main # Start long-running tests in background cd ../project-test && npm test & # Continue development in main worktree cd ../project ``` ### Pattern 5: Stable Reference To maintain a clean main checkout for reference: ```bash # Create permanent worktree for main branch git worktree add ../project-main main # Lock to prevent accidental removal git worktree lock --reason "Reference checkout" ../project-main ``` ### Pattern 6: Selective Merging from Multiple Features To combine specific changes from multiple feature branches: ```bash # Create worktrees for each feature to review git worktree add ../project-feature-1 feature-1 git worktree add ../project-feature-2 feature-2 # Review changes in each worktree diff ../project/src/module.js ../project-feature-1/src/module.js diff ../project/src/module.js ../project-feature-2/src/module.js # From main worktree, selectively take changes cd ../project git checkout feature-1 -- src/moduleA.js src/utils.js git checkout feature-2 -- src/moduleB.js git commit -m "feat: combine selected changes from feature branches" # Or cherry-pick specific commits git cherry-pick abc1234 # from feature-1 git cherry-pick def5678 # from feature-2 # Clean up git worktree remove ../project-feature-1 git worktree remove ../project-feature-2 ``` ## Comparing and Merging Changes Between Worktrees Since all worktrees share the same Git repository, you can compare files, cherry-pick commits, and selectively merge changes between them. ### Compare and Review File Changes Since worktrees are just directories, you can compare files directly: ```bash # Compare specific file between worktrees diff ../project-main/src/app.js ../project-feature/src/app.js # Use git diff to compare branches (works from any worktree) git diff main..feature-branch -- src/app.js # Visual diff with your preferred tool code --diff ../project-main/src/app.js ../project-feature/src/app.js # Compare entire directories diff -r ../project-v1/src ../project-v2/src ``` ### Merge Only One File from a Worktree You can selectively bring a single file from another branch using `git checkout`: ```bash # In your current branch, get a specific file from another branch git checkout feature-branch -- path/to/file.js # Or get it from a specific commit git checkout abc1234 -- path/to/file.js # Get multiple specific files git checkout feature-branch -- src/module.js src/utils.js ``` For **partial file changes** (specific hunks/lines only): ```bash # Interactive patch mode - select which changes to take git checkout -p feature-branch -- path/to/file.js ``` This prompts you to accept/rej
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.