Skip to content

Commit graph

The home screen is git log --graph --all rendered as pre-computed SVG/PNG that ships inline through your terminal’s image protocol (Kitty / iTerm2 / Sixel). It auto-detects the renderer at startup; force one with --graph-renderer. Alternatively, use --graph-renderer ascii to render with Unicode box-drawing characters in any terminal (no image protocol needed).

Each row carries:

  • Graph cell, branches, merges, the commit dot (orange for HEAD).
  • Commit message with inline ref glyphs (branch / remote / tag / stash).
  • Author name, coloured per the theme. Avatar painted inline when cached.
  • Short hash.
  • Date, format set by core.option.date_time_format.

The top row is a synthetic Uncommitted Changes entry. Drilling into it opens the Uncommitted view for staging + commit.

Commit graph, busy history with branches, merge, tag, stash, HEAD in orange, Uncommitted row on top

f opens the search input. By default search is incremental, fuzzy off, case-insensitive off. Inline toggles while the search is active:

PressEffect
sToggle case sensitivity.
zToggle fuzzy matching.
xToggle regex (after a search is applied).
EnterApply the query (status line shows “Match N of M”).
n / NNext / previous match.
EscClear the query and exit search mode.

The search bar’s toggle state persists per-session via [core.search] in the config.

Search flow, f to open, live highlight, toggle case + fuzzy, n/N to jump between matches

  1. Press Space on commit A, a brand-coloured chip marks it.
  2. Move the cursor to commit B (any direction, any distance).
  3. Press Space again, gitoui opens the Compare view with the cumulative diff between the two endpoints (git diff <a>..<b>).

Ctrl+click is the mouse equivalent. Esc clears the mark at any point.

2-commit compare, Space on A, scroll, Space on B, Compare view opens with the cumulative diff

The launch shows ~500 recent commits instantly. A background thread streams the rest of the history in parallel, reading from the on-disk cache (fast: a few hundred ms even on 300k-commit repos) or walking git log from scratch on the first visit.

As batches arrive, commits appear progressively in the list. A spinning Loading N commits indicator at the bottom of the list shows the live count; it disappears the moment streaming completes. The animated G logomark in the top-right header also pulses during loading as an at-a-glance “still working” signal.

Only lightweight commit metadata is streamed (hash, author, date, subject, parents). The full commit body and committer details are fetched on demand when you open the Detail view, keeping memory usage low even on huge repositories.

The on-disk cache lives at $XDG_CACHE_HOME/gitoui/<repo-hash>/commits.bin. It is invalidated automatically when HEAD moves, when the commit sort order changes (Chronological vs Topological), or when the cache format is outdated. Run gitoui -C (or --clear-cache) to wipe it manually.

-n N on the CLI caps the foreground slice to exactly N commits (the amount you see in the very first frame). The background loader always walks the full history regardless of -n.

On repositories with more than 50 000 commits (configurable via [core.option] huge_repo_threshold in your config), the graph column is automatically disabled on the first visit to keep things smooth. You can always toggle it back on from the Config view (p), a warning will remind you that performance may be affected.

The threshold is checked per-repo: switching from a huge repo to a small one via d (change directory) re-enables the graph based on your saved config.

On repos with many parallel branches, the native graph can be hundreds of lanes wide. gitoui handles this by capping the graph column at ~40 % of the panel width and exposing a horizontal scroll:

  • < / > slide the viewport over the lanes.
  • All visible rows scroll together (Kitty source-rect crop).
  • iTerm2 / Sixel terminals don’t support source-rect crop: lanes past the cap are clipped.

Set --graph-renderer ascii (or [core.option] graph_renderer = "ascii" in config) to render the graph using Unicode box-drawing characters instead of image protocol. This works in any terminal without requiring Kitty, iTerm2, or Sixel support.

Set [ui.list] graph_enabled = false (or toggle “Graph Enabled” in the p config view). That removes the graph pipeline entirely and scrolling becomes near-instant even on 300 000-commit histories.

Some transient repo states surface directly on the row they apply to no need to hunt through a sidebar:

  • ⚠ N conflicts (red), on the Uncommitted row, when there are unmerged paths from a merge / cherry-pick / rebase conflict.
  • ↻ REBASING (yellow), on the Uncommitted row, whenever a rebase is in progress on the branch.
  • ⏸ rebase paused (yellow), on the exact commit git is paused on (read from .git/rebase-merge/stopped-sha). Press e from the commit list to jump to the resume banner and c continue / s skip / a abort.