home / skills / beshkenadze / claude-skills-marketplace / git-worktree-workflow

git-worktree-workflow skill

/skills/development/git-worktree-workflow

This skill helps manage git worktrees for isolated feature branches and streamlined PR workflows within a single Claude session.

npx playbooks add skill beshkenadze/claude-skills-marketplace --skill git-worktree-workflow

Review the files below or copy the command above to add this skill to your agents.

Files (2)
SKILL.md
4.1 KB
---
name: git-worktree-workflow
description: Manage git worktrees for branch isolation. Use when creating feature branches, working on isolated tasks, creating PRs, and cleaning up after merge.
version: 1.0.0
---

# Git Worktree Workflow

## Overview

Manage git worktrees for branch isolation within a single Claude session. Worktrees allow working on a feature branch in a separate directory while keeping the main repo untouched.

## Directory Structure

```
MainProjectDir/
├── ProjectDirApp/      # Main repo (claude runs here)
│   └── .claude/        # Claude settings & rules
└── ProjectWorkTree/    # Worktree (isolated branch work)
    └── .claude -> ../ProjectDirApp/.claude  # Symlinked
```

## Commands Reference

### Create Worktree

```bash
# From main repo directory
git worktree add ../WorktreeName -b branch-name

# Symlink Claude settings
ln -s ../CurrentRepoDir/.claude ../WorktreeName/.claude
```

### List Worktrees

```bash
git worktree list
```

### Remove Worktree

```bash
git worktree remove ../WorktreeName
git branch -d branch-name  # Delete local branch
```

## Workflows

### Phase 1: Create Worktree

```
Step 1: Create worktree with new branch
        git worktree add ../WorktreeName -b feature/my-feature

Step 2: Symlink Claude settings
        ln -s "$(basename $(pwd))"/.claude ../WorktreeName/.claude

Step 3: Verify setup
        git worktree list
```

### Phase 2: Work in Worktree

```
Step 1: Work on files in ../WorktreeName/
        Use full paths: ../WorktreeName/src/file.ts

Step 2: Commit changes
        cd ../WorktreeName && git add . && git commit -m "message"

Step 3: Push branch
        cd ../WorktreeName && git push -u origin feature/my-feature
```

### Phase 3: Create PR

```
Step 1: Create pull request
        cd ../WorktreeName && gh pr create --base main --head feature/my-feature

Step 2: Return PR URL to user
        Wait for approval
```

### Phase 4: After Merge - Cleanup

```
Step 1: Return to main repo
        cd back to original repo

Step 2: Pull latest main
        git pull origin main

Step 3: Remove worktree
        git worktree remove ../WorktreeName

Step 4: Delete local branch
        git branch -d feature/my-feature

Step 5: Verify cleanup
        git worktree list
```

## Guidelines

### Do
- Symlink `.claude/` directory - never copy
- Use relative paths for symlinks (`../RepoName/.claude`)
- Cleanup after PR merge (remove worktree + delete branch)
- Work in worktree using full paths from main repo
- Return to main repo before cleanup operations

### Don't
- Copy `.claude/` directory (breaks updates)
- Use absolute paths for symlinks
- Leave worktrees after merge (clutters disk)
- Delete worktree before pushing changes

## Examples

### Example: Feature Development

```bash
# Create
git worktree add ../myapp-auth -b feature/oauth2
ln -s ../myapp/.claude ../myapp-auth/.claude

# Work (edit files in ../myapp-auth/)
cd ../myapp-auth
git add . && git commit -m "feat: add OAuth2 support"
git push -u origin feature/oauth2

# PR
gh pr create --base main --head feature/oauth2 --title "Add OAuth2" --body "..."

# After merge - Cleanup
cd ../myapp
git pull origin main
git worktree remove ../myapp-auth
git branch -d feature/oauth2
```

### Example: Bugfix

```bash
# Create
git worktree add ../myapp-fix -b bugfix/login-issue
ln -s ../myapp/.claude ../myapp-fix/.claude

# Work & PR
cd ../myapp-fix
# ... fix bug, commit, push, create PR ...

# Cleanup after merge
cd ../myapp
git worktree remove ../myapp-fix
git branch -d bugfix/login-issue
```

## Error Handling

### Worktree already exists
```bash
# Check existing worktrees
git worktree list

# Remove if stale
git worktree remove ../WorktreeName --force
```

### Branch already exists
```bash
# Use existing branch instead of -b
git worktree add ../WorktreeName existing-branch
```

### Unmerged changes in worktree
```bash
# Force remove (loses uncommitted changes)
git worktree remove ../WorktreeName --force
```

## Installation

Symlink the helper script (do not copy):

```bash
ln -s /path/to/skills/development/git-worktree-workflow/scripts/worktree.sh .claude/scripts/worktree.sh
```

Overview

This skill manages git worktrees to isolate branch work in separate directories while keeping the main repository clean. It provides commands and a simple workflow for creating, using, publishing, and removing worktrees tied to feature or bugfix branches. The skill emphasizes symlinking shared Claude settings and safe cleanup after merges.

How this skill works

It creates an independent worktree directory linked to a new or existing branch using git worktree add, then symlinks the shared .claude settings directory to keep agent configuration consistent. You work, commit, and push from the worktree directory, create a pull request there, and after merge return to the main repo to pull changes and remove the worktree. It also includes common error-handling commands for stale worktrees, existing branches, and forced removal of uncommitted changes.

When to use it

  • Starting a new feature branch and wanting filesystem isolation from the main repo
  • Fixing bugs in parallel without switching the main checkout
  • Preparing a pull request while keeping the primary working tree stable
  • Testing large refactors or experimental changes safely
  • Cleaning up local branches after merge to avoid disk clutter

Best practices

  • Always symlink the .claude directory from the main repo; do not copy it
  • Use relative paths for symlinks (e.g., ../RepoName/.claude) to keep setups portable
  • Work inside the worktree directory and use full paths from the main repo when referencing files
  • Push the branch from the worktree before removing it locally
  • Return to the main repo and pull main before removing the worktree and deleting the branch

Example use cases

  • Create a feature worktree: git worktree add ../myapp-auth -b feature/oauth2; ln -s ../myapp/.claude ../myapp-auth/.claude; work, push, create PR
  • Isolate a hotfix: git worktree add ../myapp-fix -b bugfix/login-issue; fix, commit, push, open PR from the worktree
  • Clean up after merge: cd to main repo, git pull origin main; git worktree remove ../myapp-auth; git branch -d feature/oauth2
  • Recover from stale state: use git worktree list to find leftovers and git worktree remove ../name --force to remove a stale worktree

FAQ

What if the branch name already exists?

Create the worktree using the existing branch by omitting -b: git worktree add ../WorktreeName existing-branch.

Can I copy the .claude directory into the worktree?

No. Always symlink .claude to the main repo to avoid breaking updates; copying will diverge configurations.