Skip to content

Feature idea: diff a branch/worktree against a base branch (merge-base) via the compare view #2996

Description

@stevenpollack

Summary

Bind v to open the existing compare-commits view for a branch (or worktree) against a base branch, diffed from their merge-base (three-dot, base...HEAD) so it shows only that branch's own changes — a PR-style "what did this branch change" review. No new popup or tab: it reuses CompareCommitsPopup unchanged.

Motivation

The Branches popup already has Shift+C ("Compare"), but that's a tip-to-tip (two-dot) diff of the selected branch vs HEAD, so it includes commits the base gained after the fork point (and reads in the opposite direction). A merge-base diff answers the "what has my branch changed relative to X" question directly, the way a PR diff reads.

What it adds

One key, v (diff_base); the base varies by context, always merge-base:

  • Global v — current branch (HEAD) vs the repo's base branch (auto-resolved: main/master/origin/*).
  • Branches popup v ("Diff since branch-point") — current branch vs the highlighted branch (an arbitrary base). Sits next to the existing Shift+C ("Compare"); the distinct labels keep the two clear.
  • Worktrees popup v — the selected worktree's branch vs the base branch, without switching into it.

Backend is a small asyncgit branch_diff module (merge_base, resolve_base_branch, diff_range_vs_base, diff_range_vs_ref). The triggers just resolve two commit ids and push the existing OpenPopup(CompareCommits(...)).

Worktree touch-point (heads-up)

The Worktrees-popup v is built on a worktree-management popup that isn't upstream yet — proposed separately in #2995. So that surface can't land independently: a PR against current master would be global v + Branches-popup v only, with the worktree surface following if/after #2995 lands.

Questions

  1. Is this something you'd want as a PR?
  2. If so, preferred scope — just the global "diff current branch vs main" v, or also the Branches-popup v (given the Shift+C overlap)?
  3. Any preference on the key (v) or the command naming?

Working implementation on my fork if useful: https://github.com/stevenpollack/gitui/tree/feat/branch-diff

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions