GitButler
v0.22.3A Git client built around stacked branches.
FreeFree and open source.macOSUpdated on Aug 29, 2026
About
GitButler reorganises Git so that work in progress does not have to be one linear branch. Changes are assigned to virtual branches, several can be in flight at once, and a commit can be amended or split without rewriting history by hand. It was built by a GitButler GmbH team, is free, and is open source.
- Price
- Free, Free and open source.
- Version
- 0.22.3 · Aug 29, 2026
- Platforms
- macOS
- Category
- Developer Tools
Featured badge
Make GitButler yours: show the badge on its site and the listing marks itself as linked back.
<a href="https://macgrove.app/apps/gitbutler">
<img src="https://macgrove.app/badge/gitbutler.svg" alt="Featured on MacGrove" width="257" height="32" />
</a>[](https://macgrove.app/apps/gitbutler)What’s new
All 20 releases0.22.3Latest · on Aug 29, 2026
- 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
Download bins from https://gitbutler.com/
Earlier
0.22.2Updating the workspace now fast-forwards a local target branch like main after its remote branch advances
- Updating the workspace now fast-forwards a local target branch like main after its remote branch advances
- 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
- but diff --tui is now but tui --diff
- but diff --no-tui and but config ui have been removed
- Press b in 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
- @macgyver13 made their first contribution in
Download bins from https://gitbutler.com/
0.22.1macOS: Holding ⌘ while selecting a project now shows that it will open in a new window
- 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 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
- Adds but resolve conflicts and but resolve apply for inspecting and resolving individual conflicts in conflicted commits without checking them out
- but commit can now target any branch chosen from the picker, including branches lower in a stack
- but commit, but amend, but move, and but squash now show example commands when arguments are invalid
- but move <branch> --branch <other-branch> can now stack one branch onto another
- but now detects the terminal's light or dark theme automatically; BUT_THEME still overrides it
- Adds c, m, and s as default aliases for but commit, but move, and but squash
- but pick now supports branch targeting with --branch, --above, and --below
- but squash and but discard now accept directory paths to select the uncommitted changes within them
- but discard with no target now discards all uncommitted changes
- but uncommit <branch> now moves the branch's commits back to uncommitted changes and removes the branch
- but discard --json and but move --json now include a type field on each result
- The but push picker now shows one entry per stack and which ancestor branches will also be pushed
- but branch new now supports --above and --below for positioning branches; --anchor and -a remain deprecated aliases for --above
- but land now deletes the branch from its push remote after landing succeeds
- but branch --help now points to but reword for 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 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 to
- but push --json now includes the destination branch name in each branchToRemote entry
- but unapply now explains how to create a branch when the commits being unapplied are not attached to one
- but push now exits non-zero when one or more branches in a batch fail to push
- but reword now preserves conflict state when rewording a conflicted commit
- but status, but pull, and but commit no longer fail when a clean commit is incorrectly marked as conflicted
- Fixes but push failing to detect conflicted commits in ancestor branches before pushing
- Fixes but land and but pull deleting tracked files in some workspaces
- Fixes but status failing with a "too many IDs" error in repositories with a very large number of untracked files
- Fixes but pull failing when a branch in a stack was squash-merged upstream
- 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; --diff opens the diff view immediately and replaces the deprecated but 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 p in the TUI to cherry-pick the selected commit
- The TUI action bar now lists commit before squash when 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
- @C0rn3j made their first contribution in
0.22.0Native GitHub Stacked PR Support is available in gitbutler 🥞🎉
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
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, and but commit --only have been removed
- but commit now takes sources positionally and uses -b/--branch for the target branch and --above or --below for stacking
- but 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 squash
- but 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 branch
- but rub has been replaced by but squash
- but amend and but squash now default to uncommitted changes when you omit the source argument
- Mutation commands now print concise results with change IDs by default
- --json is now the standard machine-readable output flag, replacing --format json
- History-editing commands now refuse to modify commits already merged upstream, with --allow-merged available 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
- 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 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
Download bins from https://gitbutler.com/
- Source
- GitHub releases
- Last checked
Similar apps
- GitUp

GitUpA Git client that draws the whole repository graph.Free - Fork

ForkA fast Git client with a readable commit graph, diffs and merge tools.Paid - Tower

TowerA Git client that makes the commit graph, diffs and pull requests readable.Paid - Commit+

Commit+A native macOS Git client with drag-and-drop workflows and undo for anything.Free - Bruno

BrunoAn open-source, local-first API client that stores collections as plain text in Git.Freemium - Orca

OrcaTop pickRun several AI coding agents in parallel, each in its own git worktree.Free - FinderGit

FinderGitA Finder-style browser for your git repos, with a dashboard across all of them.Free - cmux

cmuxA terminal built for running many coding agents at once.Freemium
