wt makes git worktrees ergonomic — fork your uncommitted state into a fresh worktree, keep long-lived branches permanently checked out, and jump between them in a keystroke.
$ curl -fsSL https://wt.glevski.com/install.sh | sh
Staged, unstaged and untracked changes carry into a fresh worktree — split preserved, original untouched.
Permanent view-only worktrees for long-lived branches; one command fast-forwards them all.
Heavy paths hardlink in the background after you jump — near-zero disk, and a half-built dir never appears.
A disposable, branchless export of any sha, tag or remote branch — safe even mid-rebase.
Subcommands, worktree names, branches and your own aliases complete in zsh and bash — no plugin, it comes with the shell function.
A machine-wide registry: list, inspect and jump into any project's worktrees from any directory.
Declare a heavy directory once. Every new worktree gets it hardlinked from the one you forked: the same files on disk, with no install and no copy.
$ wt deps add node_modules
Hardlinks can't cross filesystems, so wt says so upfront and copies instead. The reference covers wt deps and wt df in full.
Promote a long-lived branch to a base: a permanent, view-only worktree named after it. When staging breaks while you're mid-feature, you jump in and look, with nothing stashed and no throwaway checkout.
$ wt base add staging
A base is a launch pad, not a build directory: it gets your ignored files (.env and friends) but not declared deps, unless you pass --deps. The reference covers wt base in full.
Complex changes take many rounds, and committing each one is overkill. A snapshot is an intermediate commit that stays out of your history: recorded natively in git, kept off the branch, and never sent to the remote.
$ wt snap
Snapshots belong to the worktree and are removed with it; wt rm says how many would go. Needs wt 0.0.19 or newer. The README has the full command list.
Register a project once and it joins a machine-wide registry. From any directory, even outside a repo, you can list its worktrees, check their status, read their logs and jump straight in.
$ wt link -r
Registration is always explicit: nothing joins the registry until you run wt link -r. The reference covers wt global and wt link in full.
wt has no config file and no database of its own. Aliases, settings and the project registry live in git config, worktrees are ordinary git worktrees, and every command runs the real git binary. Customizing wt is customizing git.
$ wt alias add cr create -c
Builtins always win over an alias of the same name. The reference covers wt alias and every configuration key.
About 3 MB, built on the Go standard library alone. No runtime, no daemon, nothing else to install or keep updated.
wt contains no network code, no telemetry and no accounts. The only thing that reaches a network is git, talking to your own remotes.
No model calls and no prompts inside the binary. Agents drive wt through the same commands you type, and it works exactly the same without one.
Every operation is a real git command you could run yourself. The one other program wt ever runs is tar, to unpack a peek.
Plugins and extensions are planned, so anything beyond the core stays opt-in instead of built in.
Homebrew, or the install script (checksum-verified, lands in ~/.local/bin). macOS and Linux, Intel and ARM.
A child process can't cd its parent shell, so the binary — worktree — is wrapped by a tiny wt function that can. One line in your rc file defines it, tab completion included.
The install script adds that line for you, to ~/.zshrc or ~/.bashrc — open a new shell and go to step 3. Homebrew leaves your rc file alone, so add it yourself:
$ echo 'eval "$(worktree init zsh)"' >> ~/.zshrc
Also needed if you ran the install script with WT_NO_MODIFY_RC=1. On bash: worktree init bash in ~/.bashrc.
Once per repo. The name decides where its worktrees live — ~/worktrees/myproject/ — and keeps two repos both cloned as app/ apart.
$ cd ~/my-repo && wt link myproject
From here, wt fork -c drops you into a fresh worktree with your changes. The command reference has the rest.
wt ships agent skills, so Claude Code — or any agent that reads skills — drives worktrees the way you would: deps declared and hardlinked, paths read back, nothing deleted behind your back.
$ npx skills add glevski/wt
Guardrails are part of the skill: it never deletes a worktree on its own initiative, never answers a y/N prompt for you, and never touches worktrees it didn't create.