release/0.22.1

gitbutlerapp/gitbutlerrelease/0.22.1Aug 24, 2026by krlvi

AI Summary

This release enhances the branch context menu with direct PR and Land actions, significantly expands CLI capabilities for conflict resolution, and improves TUI performance.

Key Highlights

  • Added 'Create PR' and 'Land' options to the branch context menu, making them available regardless of the 'Land branches directly' setting.
  • Introduced new CLI commands `but resolve conflicts` and `but resolve apply` to inspect and resolve conflicts without checking out.
  • Enabled cherry-picking in the TUI using the `p` key and improved diff rendering performance.
  • Added support for stacking branches onto others using `but move <branch> --branch <other-branch>`.

New Features

  • CLI aliases `c`, `m`, and `s` for `commit`, `move`, and `squash`.
  • TUI cherry-pick functionality (`p` key).
  • CLI support for stacking branches onto others.

Full Release Notes

## 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 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

## 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; `--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

## New Contributors
* @C0rn3j made their first contribution in https://github.com/gitbutlerapp/gitbutler/pull/15404

**Full Changelog**: https://github.com/gitbutlerapp/gitbutler/compare/release/0.22.0...release/0.22.1