The Branches view lists local branches only. A branch that exists on the remote but has never been
checked out locally is invisible, so there is no way to see what colleagues are working on, and no
way to check one out from the dashboard.
src/git/repository.cpp:624:
if (git_branch_iterator_new(&branch_iter, repo, GIT_BRANCH_LOCAL) == 0) {
GIT_BRANCH_LOCAL, not GIT_BRANCH_ALL. model::Branch (src/model/history.hpp:42) has no field
distinguishing one kind from the other, so this is a model change and not only an iterator argument.
Why it matters beyond the listing
Two other things want this and are awkward without it:
- Opening a pull request needs a target branch the user can pick, and the useful targets are
remote branches — frequently ones with no local copy.
- Changing the CI ref filter wants the same picker.
So this is worth doing before either of those rather than alongside them.
Proposed
- Iterate
GIT_BRANCH_ALL and tag each entry with its kind.
- Pair them in the panel rather than listing them twice: a local branch and its upstream are one
row today and should stay one row. What is new is the rows for remote branches with no local
counterpart, which are the ones currently missing entirely.
- Checking one out creates the local tracking branch, which is
git checkout -b <name> --track <remote>/<name>. This has the same blocked-by-a-dirty-tree case the existing checkout already
handles.
- Ahead/behind is meaningless for a remote-only branch and should be left empty rather than shown as
zero — per the rule that what a provider does not send stays empty rather than defaulted, so a
panel can omit a field instead of printing a zero that reads as a fact.
Documentation note
CLAUDE.md currently describes the view as "Branches — local and remote branches with their
upstream and ahead/behind", and CHANGELOG.md for 2026.08.0 says the same. That is not what the
code does. Either the code should match the description (this issue) or the description should be
corrected — but they should not stay in disagreement, since the file is the thing future work is
supposed to trust.
The Branches view lists local branches only. A branch that exists on the remote but has never been
checked out locally is invisible, so there is no way to see what colleagues are working on, and no
way to check one out from the dashboard.
src/git/repository.cpp:624:GIT_BRANCH_LOCAL, notGIT_BRANCH_ALL.model::Branch(src/model/history.hpp:42) has no fielddistinguishing one kind from the other, so this is a model change and not only an iterator argument.
Why it matters beyond the listing
Two other things want this and are awkward without it:
remote branches — frequently ones with no local copy.
So this is worth doing before either of those rather than alongside them.
Proposed
GIT_BRANCH_ALLand tag each entry with its kind.row today and should stay one row. What is new is the rows for remote branches with no local
counterpart, which are the ones currently missing entirely.
git checkout -b <name> --track <remote>/<name>. This has the same blocked-by-a-dirty-tree case the existing checkout alreadyhandles.
zero — per the rule that what a provider does not send stays empty rather than defaulted, so a
panel can omit a field instead of printing a zero that reads as a fact.
Documentation note
CLAUDE.mdcurrently describes the view as "Branches — local and remote branches with theirupstream and ahead/behind", and
CHANGELOG.mdfor 2026.08.0 says the same. That is not what thecode does. Either the code should match the description (this issue) or the description should be
corrected — but they should not stay in disagreement, since the file is the thing future work is
supposed to trust.