Repository navigation
Branches
The branch list lives in the Nav Pane, and also as a dropdown from the header's branch breadcrumb.
- Click a branch to check it out.
- Right-click, or use the row's More actions button, for: Checkout, Merge into current, Merge into current (no fast-forward), Squash into current, Rebase current onto, Compare with current, Set upstream…, Unset upstream, Rename, and Delete — plus, for a branch with an upstream, Delete upstream on remote…
- Each branch shows ahead/behind counts against its upstream and when it was last committed to.
- A branch checked out in another worktree is marked as such — see Worktrees & Submodules.
- If switching would overwrite uncommitted changes, Git refuses and the app says Uncommitted changes would be overwritten. Commit or stash them first. — commit or stash them, then switch.
Checking out a remote branch from the branch dropdown (for example origin/fix/login) creates or reuses a local branch that tracks it (fix/login), rather than leaving you on a detached commit. This works for remotes whose names contain a /, such as team/origin.
The new-branch widget also doubles as a GitFlow helper: choose "Start feature," "Start release," or "Start hotfix" instead of a plain branch, and it automatically prefixes the name (feature/, release/, hotfix/) and checks it out.
- "Merge into current" merges the selected branch into whatever branch you're on. When it can, Git simply moves your branch forward (a fast-forward) rather than making a merge commit.
- "Merge into current (no fast-forward)" always makes a merge commit, so the history shows where the branch was merged even when a fast-forward was possible.
- "Squash into current" stages all of the branch's changes as one change, without committing. Commit them yourself; the commit message starts out listing the squashed commits.
- If the branch is already merged, you'll see Already up to date. Nothing to merge.
- A shortcut merges your default branch (e.g.
main) into the current branch directly. - If the branch you're merging is itself behind its own upstream, you'll be warned before proceeding, with the option to pull first or merge anyway.
- Rebase moves the current branch onto another branch's tip.
Set upstream… picks the remote branch a branch tracks, and Unset upstream removes it — both without pushing. A branch's upstream is what pull, push, and the ahead/behind counts use.
Deleting a branch with unmerged commits is blocked by default; you'll be asked to confirm a force delete. Either way, an inline Undo appears right after deletion to recreate the branch at its previous tip — this undo only lasts for your current session. For a permanent recovery option (including after restarting the app), see Undo & Recovering Work.
To remove a branch from its remote, right-click it and choose Delete upstream on remote… (for example Delete origin/feature/login on remote…), or right-click a remote branch in the branch dropdown and choose Delete on remote…. It always asks for confirmation first.
"Compare with current" opens a two-branch comparison: pick any two refs and see the changed files with a full diff for each, without checking anything out.
A small warning triangle appears next to any local branch that would conflict with your current branch if merged — hover it to see which files would conflict. Remote-tracking branches that would conflict are also called out separately. A branch touching the same files that would still merge cleanly is not flagged.
This prediction needs Git 2.38 or later. On older Git versions it's simply hidden — the rest of the app still works normally (its own minimum is Git 2.23).
Getting started
Everyday work
- Working Copy & Staging
- The Diff Viewer
- Committing Changes
- Branches
- Remotes & Syncing
- Signing In to Remotes
- Worktrees & Submodules
- Search in Files
History
When things go wrong
Insights
Configuration