| Crates.io | gwm |
| lib.rs | gwm |
| version | 0.3.4 |
| created_at | 2026-01-16 12:06:59.27566+00 |
| updated_at | 2026-01-19 23:25:59.438517+00 |
| description | Git Worktree Manager - A CLI tool for managing Git worktrees with an interactive TUI |
| homepage | https://github.com/shutootaki/gwm |
| repository | https://github.com/shutootaki/gwm |
| max_upload_size | |
| id | 2048509 |
| size | 1,452,740 |
English | 日本語
A CLI tool for managing Git worktrees, allowing you to work on multiple branches simultaneously.
When reviewing multiple PRs or working on a hotfix while developing another feature, you end up running git stash and git checkout repeatedly. gwm uses Git's worktree feature to manage separate directories for each branch.
gwm wraps Git's built-in git worktree command with an interactive TUI, intuitive commands, and useful features to make worktree management effortless.
| Command | Description |
|---|---|
gwm list / gwm ls |
List worktrees |
gwm add |
Create a new worktree |
gwm go |
Jump to a worktree or open in editor |
gwm remove / gwm rm |
Remove worktrees |
gwm clean |
Detect and remove merged worktrees |
gwm sync |
Run git pull in main worktrees |
Run gwm help <command> for details on each command.
cargo install gwm
To automatically change your current shell directory after gwm add / gwm go, add the following to your shell config. This also enables shell completions.
# Bash (~/.bashrc)
eval "$(gwm init bash)"
# Zsh (~/.zshrc)
eval "$(gwm init zsh)"
# Fish (~/.config/fish/config.fish)
gwm init fish | source
Start working on a new branch:
gwm add feature/new-login -o code # Create worktree and open in VS Code
Review a PR:
gwm add fix-bug -r -o code # Create worktree from remote branch and open in VS Code
# After review
gwm remove fix-bug # Remove it
Clean up old worktrees:
gwm clean # Detect and remove merged worktrees
Worktrees are created at:
~/git-worktrees/<repository-name>/<branch-name>/
Example: ~/git-worktrees/my-app/feature-login/
gwm list (alias: ls)List worktrees in the current project.
BRANCH SYNC CHANGES PATH ACTIVITY
[*] feature/new-ui ↑2 ↓0 3M 1D ${B}/project/feature... 2h ago
[M] main ✓ clean ${B}/project/main 30m ago
[-] hotfix/logfix ↑0 ↓5 clean ${B}/project/logfix 3d ago
STATUS meanings:
[*]: Current worktree[M]: Main branches (main, master, etc.)[-]: Other worktreesColumn meanings:
SYNC: Sync status with remote (↑=ahead, ↓=behind, ✓=synced)CHANGES: Local changes (M=Modified, D=Deleted, A=Added, U=Untracked)ACTIVITY: Time since last updateOptions:
| Option | Description |
|---|---|
--format <type> |
Output format (table/json/names) |
gwm add [branch_name]Create a new worktree.
Without arguments (gwm add):
Tab to switch to remote branch selection modeWith arguments:
gwm add feature/new-login: Create new branch and worktreegwm add existing-branch: Create worktree from existing local branchgwm add pr-branch -r: Create worktree from remote branchOptions:
| Option | Description |
|---|---|
-r, --remote |
Create from remote branch |
--from <branch> |
Base branch (default: main or master) |
-o, --open <editor> |
Open in editor after creation (code/cursor/zed) |
--no-cd |
Show success message instead of path output |
--skip-hooks |
Skip post_create hooks execution |
Automatic file copying:
When copy_ignored_files is enabled, .env files are automatically copied from the main worktree to the new worktree.
gwm go [query]Select a worktree and jump to it.
With shell integration enabled (see "Shell integration (cd)"), it changes the current shell directory. Otherwise, it launches a subshell.
gwm go: Interactive selection (fuzzy search supported)gwm go feat: Filter by "feat" and selectOptions:
| Option | Description |
|---|---|
-o, --open <editor> |
Open in editor (code/cursor/zed) |
--no-cd |
Show success message instead of path |
gwm remove [query] (alias: rm)Interactively select and remove worktrees. Supports multi-select.
Options:
| Option | Description |
|---|---|
-f, --force |
Force delete even with uncommitted changes |
--clean-branch <mode> |
Delete local branch too (auto / ask / never) |
gwm cleanAuto-detect and remove worktrees that are safe to delete.
A worktree is eligible if:
Options:
| Option | Description |
|---|---|
-n, --dry-run |
Show list only, don't delete |
--force |
Delete without confirmation |
gwm sync (alias: pull-main)Find main branch worktrees (main, master, etc.) and run git pull to update them. Works from any directory.
Note: For backward compatibility, the legacy command name
gwm pull-mainis still available.
# Reviewing a PR
git stash # Save current work
git checkout main # Switch to main
git pull # Update main
git checkout pr-branch # Switch to PR branch
git pull origin pr-branch # Update PR branch
# ... review work ...
git checkout main # Back to main
git stash pop # Restore work
# Reviewing a PR
gwm add pr-branch -r # Create worktree from remote
gwm go pr-branch # Jump to review worktree
# ... review work ... (original work untouched)
gwm remove pr-branch # Remove when done
gwm help: General helpgwm help <command>: Command-specific helpCustomize behavior in ~/.config/gwm/config.toml.
| Option | Description | Default |
|---|---|---|
worktree_base_path |
Directory to create worktrees | ~/git-worktrees |
main_branches |
Branch names treated as main branches | ["main", "master"] |
clean_branch |
Delete local branch when removing worktree | "ask" |
copy_ignored_files.enabled |
Copy gitignored files to new worktrees | false |
copy_ignored_files.patterns |
File patterns to copy | [] |
copy_ignored_files.exclude_patterns |
File patterns to exclude from copying | [] |
hooks.post_create.enabled |
Run hooks after worktree creation | true |
hooks.post_create.commands |
Commands to run after creation | [] |
clean_branch values:
"auto": Auto-delete if safe"ask": Prompt for confirmation (default)"never": Never deleteworktree_base_path = "/Users/me/worktrees"
clean_branch = "ask"
[copy_ignored_files]
enabled = true
patterns = [".env", ".env.*", ".env.local"]
exclude_patterns = [".env.example", ".env.sample"]
[hooks.post_create]
commands = ["npm install"]
Create .gwm/config.toml in your repository for project-specific settings. Project settings override global settings.
Note: For backward compatibility,
gwm/config.tomlis also supported but.gwm/config.tomlis recommended for new projects.
Example: Use pnpm for this project
my-project/.gwm/config.toml:
[hooks.post_create]
commands = ["pnpm install"]
The following environment variables are available during post_create hooks:
| Variable | Description |
|---|---|
GWM_WORKTREE_PATH |
Absolute path to the new worktree |
GWM_BRANCH_NAME |
Branch name |
GWM_REPO_ROOT |
Git repository root path |
GWM_REPO_NAME |
Repository name |
MIT