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.
| Key | Action |
|---|---|
| Enter | Open the commit’s metadata and patch |
Ctrl-n / Ctrl-p | Next / previous page |
Space g r | Re-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:MMin the commit’s timezone, author, and subject. The full ID is kept behind it. - Commit detail: Enter displays
Author-time: YYYY-MM-DD HH:MMin 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
land 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:
| Action | Default key | Colon command |
|---|---|---|
| All cached refs and HEAD | Tab a | :git-network-all |
| Current HEAD only | Tab h | :git-network-head |
| Choose an exact captured ref | Tab r | :git-network-choose-ref |
| Next graph page | Ctrl-n | :next-git-network-page |
| Previous graph page | Ctrl-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
Spacein 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
| Command | Shows |
|---|---|
:git-blame | Attribution 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
uncommittedinstead 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.