gitbutler/workspaceGitButler now works in any Git repo, without the need to run a setup or to be on gitbutler/workspace ref.
All app operations work as normal. GitButler switches to gitbutler/workspace only when you apply a second parallel branch and moves back when you return to one.
You can now work with linked Git worktrees directly in GitButler. Worktrees created by other apps show up in the CLI status or as lanes in the GUI and support most GitButler operations.
For example you (or your agent) can move individual changes, commits or branches to and from worktrees as needed.
Parallel branches are light & fast while worktrees offer full code isolation so each tool can be used situationally.
Worktrees that already exist when you upgrade start archived. Bring them in from the new Worktrees page in Project settings or with the but CLI.
Discarding changes in a worktree can’t be undone yet.
gpg.ssh.defaultKeyCommandpre-commit and post-checkout hookszz is now @ for uncommitted changesbut land is now but merge, and land still works as an aliasbut setup is gone because but works in any repository. but init replaces but setup --initbut review, but branch new --anchor and ID ranges such as g0-h2 are removed. Use but pr, --above and single IDs insteadbut status lists worktrees with their own IDs and marks ones behind the targetbut worktree creates, lists, archives, restores and removes worktrees. but worktree new can start at a commit with --above or on an existing branch outside the workspacebut pull --update <workspace|worktrees> picks what to update. A worktree whose branch merged upstream moves to a new branch at the latest target commitbut move <branch> --above <branch> moves a branch between a worktree and the workspacebut split moves files or hunks out of a commit into a new commit above itbut diff <commit> shows hunk IDs, so but squash, but move, but uncommit and but discard can work on single hunks of a commitbut merge and but pull work without a remote, using the local target branchbut merge --ff-only refuses merges that can't fast-forwardbut commit, but squash, but move and but split read the message from a file or stdin with -F/--filebut status marks the checked-out branch with [HEAD]b is a default alias for but brancha) and unarchive (u) worktreesb moves commits onto a new branch above the selected oneu) works from details modebut tui starts faster, especially on Linux? and : now respondgitbutler/workspace accidentally publishing unrelated applied branches.git within their namesExperience GitButler’s newest features before anyone else. ⋆˚₊ Get Nightly ☽˚.⋆
0.22.3
0.22.2
main after its remote branch advancesbut diff --tui is now but tui --diffbut diff --no-tui and but config ui have been removedb in the TUI to enter branch mode, where branches can now be discardedmain after its remote branch advancesbut diff --tui is now but tui --diffbut diff --no-tui and but config ui have been removedb in the TUI to enter branch mode, where branches can now be discarded⌘ while selecting a project now shows that it will open in a new windowbut resolve conflicts and but resolve apply for inspecting and resolving individual conflicts in conflicted commits without checking them outbut commit can now target any branch chosen from the picker, including branches lower in a stackbut commit, but amend, but move, and but squash now show example commands when arguments are invalidbut move <branch> --branch <other-branch> can now stack one branch onto anotherbut now detects the terminal's light or dark theme automatically; BUT_THEME still overrides itc, m, and s as default aliases for but commit, but move, and but squashbut pick now supports branch targeting with --branch, --above, and --belowbut squash and but discard now accept directory paths to select the uncommitted changes within thembut discard with no target now discards all uncommitted changesbut uncommit <branch> now moves the branch's commits back to uncommitted changes and removes the branchbut discard --json and but move --json now include a type field on each resultbut push picker now shows one entry per stack and which ancestor branches will also be pushedbut branch new now supports --above and --below for positioning branches; --anchor and -a remain deprecated aliases for --abovebut land now deletes the branch from its push remote after landing succeedsbut branch --help now points to but reword for renaming branchesdsh) is now detected as a coding agent, with automatic skill setupbut pull now keeps both versions when target-branch updates conflict with uncommitted work; resolve the files with but resolve <path>...but pr new now reports the branch and remote that were actually pushed tobut push --json now includes the destination branch name in each branchToRemote entrybut unapply now explains how to create a branch when the commits being unapplied are not attached to onebut push now exits non-zero when one or more branches in a batch fail to pushbut reword now preserves conflict state when rewording a conflicted commitbut status, but pull, and but commit no longer fail when a clean commit is incorrectly marked as conflictedbut push failing to detect conflicted commits in ancestor branches before pushingbut land and but pull deleting tracked files in some workspacesbut status failing with a "too many IDs" error in repositories with a very large number of untracked filesbut pull failing when a branch in a stack was squash-merged upstreambut tui <ID> can now open directly on a branch, commit, file, or hunk; --diff opens the diff view immediately and replaces the deprecated but diff --tuip in the TUI to cherry-pick the selected commitcommit before squash when both are availableNative GitHub Stacked PR Support is available in gitbutler 🥞🎉
Breaking changes: This release overhauls the commit, amend, squash, discard and move. The commands rub, stage and unstage have been removed. For agentic use its important to update the skill (but skill check --update)
but stage, but unstage, and but commit --only have been removedbut commit now takes sources positionally and uses -b/--branch for the target branch and --above or --below for stackingbut squash still takes sources positionally but now uses -t/--target for the target. It can squash all types of sources into commits, branches, and the uncommitted area.but amend and but uncommit work similarly to but squashbut move still takes sources positionally but now uses -t/--target, --above, or --below for the target. It can move commits, committed files, and branches. Use --unstack to unstack a branchbut rub has been replaced by but squashbut amend and but squash now default to uncommitted changes when you omit the source argument--json is now the standard machine-readable output flag, replacing --format json--allow-merged available for deliberate overrides--remember-selection, restoring the previous selection when reopenedy to copy a commit's change IDbut — create, update, and merge pull requests, plus CI check statusbut status and mutation commands (commit, reword, and more) now identify commits by their change ID — GitButler's stable ID that survives rebases — rather than the commit SHAbut now auto-detects more AI coding agents (including Pi and Poolside) and tailors its output for them by defaultbut pull, but resolve, and but status now walk you through resolving conflicts, listing each conflicted commit and how to fix itbut commit now explains failures caused by conflicting commit dependencies, naming the branch that owns thembut config push-remote [remote] to view or set the fork remote your branches push to, independent of the target branchbut uncommit can now uncommit files from multiple commits or branches in one operationbut absorb now errors on an invalid source instead of silently absorbing all changesbut commit in a linked Git worktree suggested GitButler setup instead of reporting that linked worktrees are unsupportedYou can now land a branch straight onto its target eg. origin/main, without ever opening a pull/merge request.
In the desktop app this is enabled in the project settings (Git stuff) or during project setup. In the CLI this is done with but land <branch>.
but land <branch> lands an applied branch directly onto its target, skipping the pull requestbut merge has been removed — but land <branch> --yes now covers itbut commit and but amend now report which branch and commit each rejected change depends onbut resolve <commit> now has an --ai flag for auto-resolving conflicted commitshjklThere is now a new command but agent setup which makes the overall setup easier. It is an interactive wizard for tuning version control behavior (similar to https://docs.gitbutler.com/ai-agents/tuning-agent-behavior but easier to setup). Running this is a good idea for best performance.
but amend now accepts --changes to amend specific changes into a commitbut commitbut uncommit now supports a diff output option to print the resulting changesbut status now shows stacked branches that have been merged upstreambut completions now appears in the help output, making it discoverable when you grab the but binary without an installerbut output now labels "unassigned changes" as "uncommitted"but apply could report success while leaving a branch unapplied when workspace metadata was stalebut mark and but unmark commandsstdin isn't a terminalshift+yj/k/arrows move by line, ctrl+d/ctrl+u jump by 10 lines, and shift+j/shift+k jump by sectiongpg.ssh.program pointed at a path containing a tilde (~)