Safely remove a Git worktree and its directory, handling uncommitted changes and orphaned folders.
Running worktree-remove from inside the main repo:
- Ensures you are running from the main worktree.
- Resolves the target worktree/directory (branch name, worktree path, or parent-directory name; supports
<repo>-<branch>naming). - Checks if the worktree is registered with Git.
- Safely handles "orphaned" directories (directories that exist but Git no longer recognizes as worktrees).
- Checks for uncommitted changes (if registered) and, when found, asks "Remove anyway?" before proceeding.
- Asks for a final confirmation to remove the registered worktree or orphaned directory (unless
--yesor--dry-run). - Moves the directory to the system trash when possible (safer than
rm -rf). - Unregisters the worktree from Git (
git worktree remove/git worktree prune). - Reports the outcome when
--verboseor--dry-runis used.
- Node.js ≥ 22.14.0
- Git with
git worktreesupport - Optional: set
WORKTREE_REMOVE_GIT_PATHto override the git executable
You usually don’t need a global install.
# inside /my/path/my-app (main worktree)
# one-off
npx worktree-remove -i
# or pass a target directly
npx worktree-remove feature/login-form
# or install globally
pnpm add -g worktree-remove # or: npm i -g worktree-remove
worktree-remove -iRun this inside the main worktree of your project.
By default, the CLI is quiet and requires an explicit target (non-interactive selection). Pass a target explicitly, or use --interactive to pick from a list. In a TTY it will still prompt for confirmations unless --no-interactive, --yes, or --dry-run is used. Use --force to bypass safety prompts around failures and uncommitted changes.
Use the -i flag to open an interactive list of worktrees:
# inside /my/path/my-app
worktree-remove -iThis allows you to easily select which worktree to remove from a list.
You can also specify the worktree directly by:
- branch name (for worktrees on a branch)
- worktree path (works for detached HEAD worktrees)
- directory name in the parent folder (useful when there's no branch)
Note: If you pass a path that exists but isn't a registered worktree, it will be treated as an orphaned directory and moved to trash after confirmation. Path targets can point anywhere, so use caution when providing absolute or home-relative paths. For safety, unregistered directories inside the main worktree are refused.
worktree-remove <target>Example:
worktree-remove feature/login-formDetached HEAD example:
worktree-remove ../my-app-test-29Sibling directory name example:
worktree-remove my-app-test-29-i, --interactiveinteractively select a worktree to remove--no-interactivedisable all prompts and interactive selection-y, --yesassume yes for all confirmation prompts-f, --forceskip safety prompts on failures and uncommitted changes (final confirmation still required unless--yesor--dry-run)--dry-runshow what would be removed without making changes--verboseshow detailed progress output--quietsuppress non-error output
# remove a worktree by branch name
worktree-remove feature/login-form# preview what would be removed
worktree-remove --dry-run feature/login-form# use an interactive selector
worktree-remove --interactive# pipe a worktree path from git + fzf
git worktree list --porcelain | rg '^worktree ' | sed 's/^worktree //' | fzf | xargs worktree-remove --yesIn CI or non-interactive shells, pass --yes or --dry-run. Use --no-interactive to prevent any prompts.
Add to your CLAUDE.md or AGENTS.md:
# Rule: `worktree-remove` Usage
Run `npx -y worktree-remove --help` to learn available options.
Use `worktree-remove` when you need to safely remove Git worktrees.
It handles uncommitted changes, orphaned directories, and moves
files to trash instead of permanent deletion.MIT