User guide / Git

History, search, and blame

Development reference · View source

Commit history

Space g l opens history in pages of up to 10,000 commits, newest first in Git’s topological order.

KeyAction
EnterOpen the commit’s metadata and patch
Ctrl-n / Ctrl-pNext / previous page
Space g rRe-read the view
  • First line: current and total pages, the earliest and latest author dates, and a paging reminder, separated by | and within 80 characters. The reminder is a muted hint, not buffer text: it cannot be selected, searched, or copied.
  • Each row: short object ID, author date and time as YYYY-MM-DD HH:MM in the commit’s timezone, author, and subject. The full ID is kept behind it.
  • Commit detail: Enter displays Author-time: YYYY-MM-DD HH:MM in the commit’s original timezone, matching the history row’s date and time.
  • Refs: a commit’s branches and tags are a muted hint one space past that row’s own text, not aligned to a shared column, so a long subject never pushes a shorter row’s hint off a narrow pane.
  • Paging is on Ctrl chords so l and every other motion keep working. Pages use boundary objects instead of an unbounded result, so going back re-requests the earlier page.
  • Refresh keeps the caret on the same commit when it is still on the page, even if new commits appeared above; otherwise the nearest row. Only the first page refreshes automatically; later pages sit behind a commit boundary and cannot change.

Commit network

Space g n opens [git network], a read-only graph of commits reachable from local branches, cached remote branches, tags, and HEAD. Opening it never fetches. Each commit occupies one row: a six-character hash, Unicode author initials, ASCII graph, branch label, captured refs, and commit title. The branch label uses the same color as the commit’s graph path. Paths retain their columns and colors until they end; empty columns can be reused without moving surviving paths. The graph does not wrap; horizontal scrolling reaches long names and titles.

* marks a commit, + marks a parent connection, and - and | draw the rectangular paths. A -|- crossing passes through an unrelated path without joining it; its vertical stroke keeps that path’s color. Horizontal segments use the destination path’s color. Where several parents share a horizontal segment, the nearest endpoint supplies its color. Four theme colors repeat as needed, so color alone does not identify a branch.

Branch labels follow captured branch tips along first-parent paths. Git does not record the branch on which a commit was originally created; shared history keeps the surviving displayed path’s label. The current symbolic HEAD name is preferred, then a local branch, then a cached remote branch. Paths without a known name fall back to local branch containment: [in dev] means the commit is reachable from exactly one local branch, and [in dev, ...] means it is reachable from several. The displayed containing branch is the current local branch when it contains the commit; otherwise it is the branch with the newest tip commit (committer timestamp, with branch name breaking ties). This is current membership, not historical branch ownership. Remote branches and tags do not count toward this fallback. [?] means neither a path name nor local containment is known. Captured names and membership remain fixed until explicit refresh.

Enter opens full commit detail, including the full object ID, all merge parents, and Author-time: YYYY-MM-DD HH:MM in the author’s original timezone. Short hash collisions do not affect navigation: each row retains its full commit identity. Closing detail returns to the same page, selection, and viewport. Ctrl-n and Ctrl-p move through cached 200-commit pages. The first line names the scope, page, continuation, and any limit. Tab opens these registered actions:

ActionDefault keyColon command
All cached refs and HEADTab a:git-network-all
Current HEAD onlyTab h:git-network-head
Choose an exact captured refTab r:git-network-choose-ref
Next graph pageCtrl-n:next-git-network-page
Previous graph pageCtrl-p:previous-git-network-page

:git-network-ref refs/heads/main selects an exact full ref directly. :git-network or Space r captures new roots; refreshing keeps the selected commit while it remains within the bounded traversal. Continuation uses the original object IDs and labels even if refs move, marking that generation stale. No remote access or idle graph scan runs.

Containment is captured independently of the selected graph scope, from up to 256 local branches and a topological walk of up to 10,000 commits. An incomplete branch inventory disables the fallback; commits beyond that ancestry walk also retain [?] when their paths have no name. These bounds, including the 2 MiB ancestry-output bound, display a separate local containment limit notice rather than guessing a name or claiming a single containing branch from incomplete evidence. This notice preserves the graph’s continuation status; narrowing the graph scope does not change the containment bounds.

If a parent needs a new lane beyond the 16-lane limit, an overflow parents note lists its abbreviated ID; existing parent lanes remain connected even at capacity. Enter exposes every full parent ID. Unplaced commits and shallow boundaries are labelled. Limits are 256 captured refs plus HEAD, 16 lanes, 50 retained pages, and 10,000 commits per generation, with 200 commits per page and a 2 MiB subprocess-output bound per read. An atomic refresh temporarily retains at most two bounded generations while locating the selected commit. Traversal reads immutable ancestry without replacement refs; changing shallow boundaries requires a fresh generation. Narrow the scope when a graph limit is reached. Ordinary movement, search, copying, selections, and splits remain available throughout the network.

Searching commits

Space g f opens a fuzzy picker over commits reachable from HEAD, newest first.

  • It matches subjects, message bodies, the object ID (a prefix is enough), the author, and the author date.
  • Rows rank as lines, not paths, so / is an ordinary character.
  • Spaces split the query into terms that must appear in order. The first Space in an empty filter still closes the picker.
  • Rows show the subject, author date, author, and abbreviated ID. The preview shows the full message.
  • Enter opens the same commit detail as the log and blame.
  • Discovery is asynchronous and capped at the newest 5,000 commits; the picker says when the cap is reached.

Blame

CommandShows
:git-blameAttribution for the primary line, without leaving the file
Space g B (:git-blame-file)A read-only view aligned to the source rows; Enter opens the row’s commit
  • Both send the current in-memory text to Git’s porcelain blame, so an unsaved line says uncommitted instead of borrowing an older attribution.
  • A result is discarded if the buffer changes while Git works.
  • Inputs over 4 MiB, and whole-file views over 20,000 lines, are refused. Untracked or otherwise unblamable files report Git’s refusal.
  • The full-file view also shows each commit’s author date as YYYY-MM-DD, in the commit’s timezone.