Releases: gitbutlerapp/gitbutler
Release list
release/0.22.3
Fixes
- Fixes an incorrect GitHub or GitLab authentication error when syncing a project without a connected forge integration
- Fixes GitHub pull request publishing failures showing "422 Unprocessable Entity" instead of GitHub's explanation of what needs fixing
- Fixes a 0.22.2 regression were in some cases the app uses a fallback committer value instead of the configured Git identity
Full Changelog: release/0.22.2...release/0.22.3
Downloads
Download bins from https://gitbutler.com/
release/0.22.2
Changes
- Updating the workspace now fast-forwards a local target branch like
mainafter its remote branch advances
Fixes
- GitHub repositories with 100 or more open pull requests now refresh correctly as pull request activity changes
- GitLab: An open merge request with no head commit no longer breaks merge request loading
- Edit mode no longer crashes on conflicts in non-UTF-8 files or treats those conflicts as resolved
- Workspace syncs no longer fail when a remote the workspace does not use cannot be fetched
- Uncommitted changes now load correctly when staged and unstaged changes overlap
- Slow fetch, push, and clone operations are no longer cancelled after two minutes
- Pull request and merge request information stays visible when GitHub, GitLab, or Bitbucket credentials are missing or a refresh fails due to a network error
- Onboarding no longer gets stuck when no Git identity is configured
- Restoring operation history now keeps the full stack when duplicate branch names exist across stacks
- Unapplying a stack no longer fails when its branch names also exist in another stack
- Updating a branch from upstream no longer fails with "BUG: Add edge introduces a cycle" after a local upstream merge
- Pull requests are no longer shown as "not mergeable" while merge status is still loading or temporarily unavailable
CLI
but diff --tuiis nowbut tui --diffbut diff --no-tuiandbut config uihave been removed
TUI
- Press
bin the TUI to enter branch mode, where branches can now be discarded - You can now create a new branch and switch to it, including positioning it above or below another branch
- Adds branch search, so you can find an existing branch and switch to it
- Commits can now be moved to a new branch
New Contributors
- @macgyver13 made their first contribution in #15611
Full Changelog: release/0.22.1...release/0.22.2
Downloads
Download bins from https://gitbutler.com/
release/0.22.1
Changes
- macOS: Holding
⌘while selecting a project now shows that it will open in a new window - Adds "Create PR" and "Land" to the branch context menu, so both actions are available regardless of the "Land branches directly" setting
- When updates from the target branch conflict with uncommitted work, GitButler now keeps both versions, shows the files as conflicted, and lets you mark them as resolved
Fixes
- Fixes unexpected vertical scrolling of the workspace while dragging branches between lanes
- Fixes tracked files being deleted in some workspaces after landing a branch
- Fixes failed GitHub operations showing a generic response-decoding error instead of GitHub's actual error message
- Fixes rebase operations unexpectedly moving tags
- Fixes conflicted commits losing their conflict state when reworded
- Fixes stale uncommitted files being shown after commits made by the CLI or another process
- Fixes clean commits being incorrectly treated as conflicted
- Fixes commit and merge request links using the wrong URL for self-hosted forges reached over SSH on a non-standard port
- Fixes workspace updates failing after a branch in a stack was squash-merged upstream
- Fixes "Open in browser" requiring a second click from the branch menu
- Fixes the diff view failing to highlight commits that uncommitted changes depend on
- Fixes successful pushes to branches tracking a non-default remote being reported as failures
- Fixes GitLab projects with many merge requests not showing all of them
- Fixes some GitHub pull requests getting stuck at "mergeability is unknown", leaving the Merge action disabled
- Fixes GitHub repositories with more than 100 open pull requests not showing all of them
- Fixes a branch-not-found error in the branch view after the displayed branch was integrated, landed, or deleted
- Fixes project-not-found errors that could appear after deleting a project or cancelling project setup
CLI
- Adds
but resolve conflictsandbut resolve applyfor inspecting and resolving individual conflicts in conflicted commits without checking them out but commitcan now target any branch chosen from the picker, including branches lower in a stackbut commit,but amend,but move, andbut squashnow show example commands when arguments are invalidbut move <branch> --branch <other-branch>can now stack one branch onto anotherbutnow detects the terminal's light or dark theme automatically;BUT_THEMEstill overrides it- Adds
c,m, andsas default aliases forbut commit,but move, andbut squash but picknow supports branch targeting with--branch,--above, and--belowbut squashandbut discardnow accept directory paths to select the uncommitted changes within thembut discardwith no target now discards all uncommitted changesbut uncommit <branch>now moves the branch's commits back to uncommitted changes and removes the branchbut discard --jsonandbut move --jsonnow include atypefield on each result- The
but pushpicker now shows one entry per stack and which ancestor branches will also be pushed but branch newnow supports--aboveand--belowfor positioning branches;--anchorand-aremain deprecated aliases for--abovebut landnow deletes the branch from its push remote after landing succeedsbut branch --helpnow points tobut rewordfor renaming branches- Improved the guidance shown to coding agents when the GitButler skill is missing or a CLI update is available
- DeepSeek Harness (
dsh) is now detected as a coding agent, with automatic skill setup but pullnow keeps both versions when target-branch updates conflict with uncommitted work; resolve the files withbut resolve <path>...but pr newnow reports the branch and remote that were actually pushed tobut push --jsonnow includes the destination branch name in eachbranchToRemoteentrybut unapplynow explains how to create a branch when the commits being unapplied are not attached to onebut pushnow exits non-zero when one or more branches in a batch fail to pushbut rewordnow preserves conflict state when rewording a conflicted commitbut status,but pull, andbut commitno longer fail when a clean commit is incorrectly marked as conflicted- Fixes
but pushfailing to detect conflicted commits in ancestor branches before pushing - Fixes
but landandbut pulldeleting tracked files in some workspaces - Fixes
but statusfailing with a "too many IDs" error in repositories with a very large number of untracked files - Fixes
but pullfailing when a branch in a stack was squash-merged upstream
TUI
- Improved diff rendering performance, especially for uncommitted files
- You can now switch directly between commit, squash, and move modes in the TUI
but tui <ID>can now open directly on a branch, commit, file, or hunk;--diffopens the diff view immediately and replaces the deprecatedbut diff --tui- Improved the TUI graph preview when moving a branch out of a stack
- You can now uncommit an entire branch in the TUI
- You can now press
pin the TUI to cherry-pick the selected commit - The TUI action bar now lists
commitbeforesquashwhen both are available - Fixes ANSI color codes appearing in TUI error messages
- Fixes stale selection marks remaining after closing a commit's file list in the TUI
- Fixes conflicted commits losing their conflict state when reworded in the TUI
New Contributors
Full Changelog: release/0.22.0...release/0.22.1
release/0.22.0
Changes
Native GitHub Stacked PR Support is available in gitbutler 🥞🎉
- GitButler now automatically uses GitHub's native stacked pull requests for enrolled repositories, falling back to description footers otherwise
- You can now choose per project whether GitButler adds stack metadata to pull and merge request descriptions
- Cherry-picking now creates conflicted commits when a pick conflicts instead of blocking it
CLI
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)
- The CLI no longer reads change assignments from the desktop app. All worktree changes are treated as uncommitted;
but stage,but unstage, andbut commit --onlyhave been removed but commitnow takes sources positionally and uses-b/--branchfor the target branch and--aboveor--belowfor stackingbut squashstill takes sources positionally but now uses-t/--targetfor the target. It can squash all types of sources into commits, branches, and the uncommitted area.but amendandbut uncommitwork similarly tobut squashbut movestill takes sources positionally but now uses-t/--target,--above, or--belowfor the target. It can move commits, committed files, and branches. Use--unstackto unstack a branchbut rubhas been replaced bybut squashbut amendandbut squashnow default to uncommitted changes when you omit the source argument- Mutation commands now print concise results with change IDs by default
--jsonis now the standard machine-readable output flag, replacing--format json- History-editing commands now refuse to modify commits already merged upstream, with
--allow-mergedavailable for deliberate overrides - Errors now include recovery guidance for history edits, pull conflicts, cherry-picks, and pull or merge request actions, including newly conflicted commits and operations rejected by commit dependencies
TUI
- The TUI now has a dedicated squash mode that lets you select the source or target first and squash across multiple branches, replacing rub mode
- The TUI can now open files and hunks in configured external programs, with multi-file selection, user-defined macOS apps, and per-extension defaults
- The TUI can now discard multiple branches at once
- The TUI now supports
--remember-selection, restoring the previous selection when reopened - TUI diffs now use Catppuccin syntax highlighting
- Fixes tab indentation in TUI diffs
Fixes
- Fixes web links for self-hosted forges that use a custom port
- Fixes an issue where failed cherry-picks could fail silently
- Fixes merge handling so adjacent edits to the same file are detected as conflicts, matching Git's behavior
- Bitbucket: Fixes an issue where pull requests created through GitButler omitted default reviewers
Full Changelog: release/0.21.2...release/0.22.0
Downloads
Download bins from https://gitbutler.com/
release/0.21.2
What's Changed
- Fixes a 0.21.1 regression where a pull request cache left by an older version could break the workspace after upgrading
- Fixes an issue where updating a branch from upstream could fail
- Bitbucket: Fixes an issue where build status checks could fail to load in some cases
- Fixes an issue where a "part 1 of 1 in a stack" footer could be added to pull requests that aren't part of a stack
Full Changelog: release/0.21.1...release/0.21.2
Downloads
Download bins from https://gitbutler.com/
release/0.21.1
Changes
- Adds Bitbucket Cloud as a first-class forge — create, update, merge, and track pull requests with CI status, right in the app
- The header project selector now groups projects by recency
- You can now find a pull request in the branches list by branch name or number
- Commit details now show the change ID next to the commit SHA
- C/C++ header files now show the correct language icon
TUI
- The details view is now actionable — mark, discard, commit, and move changes right from it, including individual hunks and committed files
- You can now search within the help view
- Press
yto copy a commit's change ID - You can now manually reload from the details view
- Fixes an issue where commands run from command mode did not execute in the active project's directory
CLI
- Adds Bitbucket Cloud support to
but— create, update, and merge pull requests, plus CI check status but statusand mutation commands (commit,reword, and more) now identify commits by their change ID — GitButler's stable ID that survives rebases — rather than the commit SHAbutnow auto-detects more AI coding agents (including Pi and Poolside) and tailors its output for them by defaultbut pull,but resolve, andbut statusnow walk you through resolving conflicts, listing each conflicted commit and how to fix itbut commitnow explains failures caused by conflicting commit dependencies, naming the branch that owns them- Adds
but config push-remote [remote]to view or set the fork remote your branches push to, independent of the target branch but uncommitcan now uncommit files from multiple commits or branches in one operationbut absorbnow errors on an invalid source instead of silently absorbing all changes- Fixes an issue where
but commitin a linked Git worktree suggested GitButler setup instead of reporting that linked worktrees are unsupported - New branches now appear at the top of the branch list instead of the bottom
Fixes
- Fixes an issue where dismissing the update banner stopped it from reappearing on a manual update check
- Fixes an issue where conflicted (unmerged) files in the working directory could cause operations to fail
- Fixes an issue where unapplying a stack could show a spurious "branch not found" error and leave the branch showing in the workspace
- Fixes an issue where undoing a commit deletion could fail when an uncommitted change touched the same file
- Fixes an issue where a repeated branch name in a stack could show a phantom "(no commits)" branch head
- Fixes a Windows-specific issue with handling deep links
New Contributors
- @arthurzam made their first contribution in #14465
- @sidfishus made their first contribution in #14633
- @reneleonhardt made their first contribution in #14796
Full Changelog: release/0.21.0...release/0.21.1
Downloads
Download bins from https://gitbutler.com/
release/0.21.0
Support for "push to main" / "skip the pull request" workflows
You 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>.
Changes
- Added a feature for resolving conflicted commits with AI (right click option) if AI is enabled for the project
- You can now apply to the workspace GitLab merge requests, including merge requests from forks
Fixes
- Fixes an issue where undoing a change could leave spurious uncommitted changes behind
- Fixes an issue where stacking one branch onto another could fail with an "Invalid parent delimitation"
- Fixes an issue where the upstream integration modal could break while branch data was being refreshed
- You can now scroll the list of steps in the upstream integration modal
- Fixes a GitHub-specific issue where pull requests from forks could use the wrong SSH URL
- Fixes an issue where a checkout could remove a directory when a file was expected in its place
CLI
but land <branch>lands an applied branch directly onto its target, skipping the pull requestbut mergehas been removed —but land <branch> --yesnow covers itbut commitandbut amendnow report which branch and commit each rejected change depends onbut resolve <commit>now has an--aiflag for auto-resolving conflicted commits
TUI
- Significantly improved performance with navigating large diffs
- The detail view now shows diff stats
- Arrow keys now work the same as
hjkl - Commit details now show the change ID
- Adds a jump mode for quickly moving around the interface
Full Changelog: release/0.20.4...release/0.21.0
Downloads
Download bins from https://gitbutler.com/
release/0.20.4
Agentic Use
There 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.
- Multi-committing, amending and splitting of commits now complete quicker and use less tokens
- Improved PR stacking workflows
Changes
- There is now a "Font size" setting for the diff views (Settings → Appearance)
CLI
but amendnow accepts--changesto amend specific changes into a commit- You can now provide a message when creating an empty commit with
but commit but uncommitnow supports a diff output option to print the resulting changesbut statusnow shows stacked branches that have been merged upstream- Hunk IDs are now stable across commits and discards
but completionsnow appears in the help output, making it discoverable when you grab thebutbinary without an installerbutoutput now labels "unassigned changes" as "uncommitted"- Fixes a bug where
but applycould report success while leaving a branch unapplied when workspace metadata was stale - Removed the
but markandbut unmarkcommands - Improved error messages when
stdinisn't a terminal
TUI
- You can now reorder stacks in the TUI
- You can now apply branches from the TUI
- You can now move multiple commits at once in the TUI
- You can now commit above or below the selected commit in the TUI
- You can now copy more things in the TUI — commit details, diff hunks, branch names and more — with
shift+y - Improved scroll keybindings:
j/k/arrows move by line,ctrl+d/ctrl+ujump by 10 lines, andshift+j/shift+kjump by section - Unapplying a branch and undoing no longer prompt for confirmation in the TUI, since both can be undone
Fixes
- Fixes a bug where moving empty branches did not work correctly
- Fixes a bug where commit-message and branch-name generation failed for non-OpenAI providers (Anthropic, Ollama, and others)
- Fixes an issue where commit signing failed when
gpg.ssh.programpointed at a path containing a tilde (~) - Fixes an issue where being offline produced repeated error toasts from background pull-request polling
- Fixes an issue where updating the workspace was not handling squash-merge integrated branches properly
New Contributors
- @ameyypawar made their first contribution in #14245
- @tobeycodes made their first contribution in #14348
Full Changelog: release/0.20.3...release/0.20.4
Downloads
Download bins from https://gitbutler.com/
release/0.20.3
Changes
- Fixes a bug causing an "there is no default target commit" error
Full Changelog: release/0.20.2...release/0.20.3
Downloads
Download bins from https://gitbutler.com/
release/0.20.2
Changes
- Fixes a regression from 0.20.1 where in some cases fetching from the remote could error out
Full Changelog: release/0.20.1...release/0.20.2
Downloads
Download bins from https://gitbutler.com/