← Package directory
Available on winget

Install worktrunk

A Git worktree manager for trunk-based development

Install with winget
winget install --id max-sixty.worktrunk
Upgrade
winget upgrade --id max-sixty.worktrunk
Uninstall
winget uninstall --id max-sixty.worktrunk

About worktrunk

worktrunk (wt) is a Git worktree manager designed for trunk-based development workflows. It simplifies creating, switching between, and managing Git worktrees, making it easy to work on multiple features or branches simultaneously without the overhead of stashing or switching branches in a single working directory.

What's new in v0.72.0

Release Notes Improved - wt merge and wt step push leave the target worktree's uncommitted changes in place: Both commands used to move a dirty target worktree's changes aside with an autostash (git stash push -u) and restore them after the push, because the fast-forward's receive.denyCurrentBranch=updateInstead refuses any dirty worktree at all. That design entered refs/stash — a repo-global namespace any process can mutate — and restored staged changes as unstaged. Both strategies now advance the target through one path: a compare-and-swap update-ref, then update-index --refresh plus read-tree -m -u in the target worktree (git's documented lenient push-to-checkout policy), with a CAS rollback if the sync can't apply, so branch and worktree move together or not at all. Uncommitted changes at paths the push doesn't touch never move — unstaged edits stay unstaged, staged entries stay staged, untracked files stay put, and refs/stash is never involved. The upfront check that names a conflicting file also reads --porcelain -uall now, so an untracked file inside an untracked directory is caught and named rather than slipping past a collapsed dir/ entry. (Breaking: the fast-forward path no longer runs a git push, so pre-push and the receive-side hooks — pre-receive, update, post-receive, post-update, and any push-to-checkout — no longer fire. A git merge run in the target wouldn't run them either, which is the line the module spec draws, and the new sync reimplements the lenient policy push-to-checkout documents rather than invoking the hook. Separately, a sync that can't apply n...

Read release notes

Version history

Version Updated Notes
v0.72.0 Unknown Release Notes Improved - wt merge and wt step push leave the target worktree's uncommitted changes in place: Both commands used to move a dirty target worktree's changes aside with an autostash (git stash push -u) and re...
v0.71.0 Unknown Release Notes Improved - Forge hosts are classified by exact DNS label: Host detection matched the bare substring, so github anywhere in a hostname selected the GitHub provider — evil-github.com and dev.azure.com.attacke...
v0.70.0 Unknown Release Notes Improved - wt step prune removes worktrees far faster: Each removal ran a serial chain of ~17 git subprocesses under the scan write lock, re-preparing a plan the scan had already computed and re-stating the...
v0.69.2 Unknown Release Notes Improved - wt remove resolves every fsmonitor daemon in one lsof call: The end-of-command sweep forked one lsof per git fsmonitor--daemon on the machine — with core.fsmonitor enabled globally that is one da...
v0.69.1 Unknown Release Notes Improved - wt switch statusline dims the dev-server URL until its port answers: The Claude Code statusline's dev-server URL now dims until something answers on its port, matching the wt list cell it already...
v0.69.0 Unknown Release Notes Improved - wt switch statusline links in Claude Code: The Claude Code statusline suppressed OSC 8 hyperlinks, so its CI segment printed colored but inert and its dev-server URL printed in full. Claude Code...
v0.68.0 Unknown Release Notes Improved - wt switch preview tabs fill on demand: Navigating to a preview tab (e.g. alt-3, the branch diff) could show "Loading…" for ~10 seconds in a large repo while the tab waited its turn in the backgro...
v0.67.0 Unknown Release Notes Improved - Experimental --reap flag for wt remove: wt remove --reap terminates processes still running in the worktree (a post-start dev server, a file watcher, a language server) before removing it, freein...
v0.66.0 Unknown Release Notes Improved - Opt-in JSON schema 2 for wt list: wt list --format=json and wt list statusline --format=json can now emit a v2 schema, selected via the [list] json-schema config key. Schema 2 wraps the rows in a...
v0.65.0 Unknown Release Notes Improved - Picker alt-x flashes why a worktree wasn't removed: When alt-x in the wt switch picker keeps a row instead of removing it, the reason now flashes in the picker header for a beat, rather than only...
v0.64.0 Unknown Release Notes Improved - {{ git.branch.* }} template namespace for custom columns: wt list custom columns can now read a branch's own git config via {{ git.branch.<key> }} — both convention keys you set yourself (branch....
v0.63.0 Unknown Release Notes Improved - [list] columns can force a column on past --full: Listing a column now overrides the --full / [list] summary presets — columns = ["branch", "ci"] shows the CI column without --full. Hard data-sou...
v0.62.0 Unknown Release Notes Improved - Browse open PRs/MRs in the wt switch picker, with live CI: The picker now streams a live CI/review-status column per row — priming from the local cache, then fetching live (it previously showed o...
v0.61.0 Unknown Release Notes Improved - wt list custom columns: Each [list.custom-columns.<Header>] entry in user config adds a column to wt list (and the wt switch picker), rendered per row as a minijinja template over branch, worktre...
v0.60.0 Unknown Release Notes Improved - Package installs complete branch and worktree names: A plain brew install worktrunk (or other package install) now tab-completes branch and worktree names, not just subcommands and flags. wt conf...
v0.59.0 Unknown Release Notes Improved - Picker frees digit keys for filtering; preview tabs move to Alt: In the wt switch picker, plain digits now go to the filter, so a branch name with a number in it can be typed directly. Preview ta...
v0.58.0 Unknown Release Notes Improved - Table-form pre-* hooks run concurrently: A multi-entry table hook ([pre-merge] with several keys) now runs its commands concurrently, completing the cut-over announced in v0.37.0: every hook type...
v0.57.0 Unknown Release Notes Improved - wt step diff --branch: wt step diff gained a -b/--branch flag, mirroring wt step commit, so the diff can target another worktree's branch without leaving the current one. The branch must have a c...
v0.56.0 Unknown Release Notes Improved - wt list JSON output includes repo_url: Each item now carries repo_url, the repository's web URL derived from the primary remote (absent when there's no parseable forge remote). It's the local che...
v0.55.0 Unknown Release Notes Improved - wt switch accepts forge PR/MR URLs: wt switch https://github.com/owner/repo/pull/123 now resolves the same way as wt switch pr:123, and the URL form works anywhere a pr:N / mr:N shortcut does (po...