Skip to content

The commit graph

How to read GitLane's swimlane commit tree.

Updated View as Markdown

The GitLane swimlane commit graph

Every line of history gets its own lane and its own colour. That’s the whole premise: instead of one tangled column, each concurrent line of development is a visually distinct swimlane you can follow with your eye.

What’s in the view

Branches, remotes, tags, stashes, and your uncommitted work all live in the same tree rather than in separate panes:

  • Stashes appear at the point in history where you made them, not in a detached list.
  • Uncommitted changes float on top as a WIP row.
  • Commit nodes show author avatars, with badges for co-authors and for commits made by bots and AI agents — Claude, Codex, Cursor, Copilot, and Dependabot are recognised.

Selecting commits

Click a commit to inspect it. Two modifiers extend the selection:

Action Result
Click Select one commit
Shift + click Select the range between the two
Cmd/Ctrl + click Add or remove one commit from the selection

A multi-commit selection is what powers combined-diff review and squashing — see Staging and committing and Branch operations.

Why it stays fast

The layout is computed in Rust. A topological walk over the commit DAG assigns each commit a lane through a reservation scheme, and the result is a plain list of (row, lane, colour) coordinates plus edges. The frontend is a dumb painter: it draws those coordinates onto a <canvas>, which keeps redraws cheap at thousands of rows where DOM or SVG nodes would not be.

The list is also virtualized — only the rows in the viewport (plus a small overscan) exist at any moment, and the canvas backing store is bounded to match.

The practical result: histories with thousands of commits scroll smoothly, and paging in more history is incremental rather than a full reload.

It updates itself

A filesystem watcher watches the open worktree recursively, including .git — so commits, checkouts, and staging you do in a terminal all register. Bursts of events are throttled so a busy rebase doesn’t thrash the UI, then the view quietly re-syncs.

Getting around

Jumping to a specific ref or commit is covered in Search — incremental highlighting for what’s on screen, full-repository search for what isn’t, and the branch navigator (Cmd/Ctrl + Alt + F) for refs.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close