base_sha pinned when the worktree was created. Click it and the BranchPicker opens.
The list
The branches come from local git, ordered by commit date, most recent first. Each row carries the name, the subject of the last commit and, if it is a remote one, theremote label.
What the list does for you:
The current branch comes with a green ✓.
The filter is 200 branches, full stop — the 200 most recent. In a repo with a big history, the branch you want may not be in the list, and the search box doesn’t help there: it filters what already came, it does not go fetch more.
watcher finds both fix/watcher and the branch whose last commit says “fix: watcher stuck in a loop”.
Exploring
Clicking a branch’s row does not switch branches. It becomes what the panel shows — the chip turns violet with its name, and the diff becomes that branch’s work. The exploration diff is notbase_sha..HEAD. It is:
base ‥ HEAD.
The default base
The comparison base is resolved in this order, stopping at the first one that exists:1
origin/HEAD
The remote’s default branch. It is the normal case for a cloned repo.
2
main, then master
Local. It applies when there is no remote — or when
origin/HEAD isn’t resolved in your clone.3
HEAD
Last resort. Comparing against itself gives an empty diff, and that is better than an error.
A shallow clone, or one made in a way that didn’t bring
origin/HEAD, falls back to the local main/master. If your project uses develop as its base, exploration will compare against main — there is no way to configure this.Fetch
The cloud icon next to the search runs:--prune makes the remotes that died on the server disappear from the list.
Switching branches
The checkout has its own door: the icon to the right of every row that isn’t the current one. It is armed in two clicks. The first turns the icon amber (“Click again to confirm the checkout”); the second executes. If you don’t confirm within 3 seconds, it disarms itself. What happens next:- Local branch →
git checkout <branch>. - Remote branch →
git checkout --track origin/<branch>, creating the local one with tracking.
Ref names
Every name coming out of the picker is validated before it becomes agit argument. What gets refused:
- empty;
- starts with
-(-rfis a flag, not a branch); - contains
..(a..bis a range, not a branch); - has a space or a null byte.
for-each-ref itself, so in practice they pass. The validation exists because IPC is a boundary: what arrives there is input, not fact.
What does not exist
- Creating a branch from the picker. A branch is born with the worktree, derived from the task title.
- Deleting a branch from the picker. The
tyba/…branch is deleted along with the worktree, in the post-delivery flow. - Configuring the default base. It is
origin/HEAD→main→master→HEAD, and that’s it. - Automatic fetch. Network only on a click.
- Pushing from the picker. The push lives in the review, after you have seen the diff.
See also
Reading the diff
The panel the picker lives in.
Resolving conflicts
When the merge stops halfway.