Everything you need to
work git visually
A canvas-rendered commit graph, drag-and-drop operations, and a full working-tree workflow — all backed by your real git.
A lane for every branch
Every line of history gets its own lane and its own colour instead of one tangled column. Stashes sit inline at the point they were created, uncommitted work shows up as a WIP row at the top, and each node carries its author avatar — badged for co-authors and for bot commits from Claude, Codex, Cursor, Copilot, or Dependabot.
Lane assignment is computed in Rust by walking the commit DAG, then painted on canvas with only the visible rows in memory, so it stays smooth at thousands of commits. A watcher on .git and the worktree keeps it in sync — commit from your terminal and the graph updates in a fraction of a second.
Drag a ref. Pick the move.
Grab any branch ref and drop it onto another. GitLane inspects the two refs and offers exactly the operations that make sense — fast-forward, merge, rebase, or reset — and nothing that doesn’t.
No memorizing flags, no reaching for the docs mid-rebase. The graph animates the result so you can see exactly what happened.

GitLane never does git behind git’s back
Every write — commit, merge, rebase, push, stash — shells out to your actual git binary. Reads use libgit2 for speed, but nothing is ever reimplemented behind your back.
So your hooks fire, your credential helpers run, your commits get signed with your key, and your .gitconfig and conflict machinery all behave exactly as they do on the command line.
PRs across every account
Browse pull requests, diffs, and CI checks through the GitHub CLI, without leaving the graph. Per-repo account binding lets you juggle multiple accounts and hosts at once.
Tokens never leave the Rust core. GitHub is first-class; other forges get clear guidance rather than silent failures.
Never commit with the wrong email
Reusable commit profiles — name, email, signing key — are kept separate from your provider accounts.
So you never accidentally commit to a client repo with a personal address, or push with an unverified signature. Bind a profile per repo and forget about it.
Your own agent, wired into the commit box
Draft and Improve write the commit message from your staged diff; Describe sums up what changed in the working tree. Each runs on the agent you pick for that action, streaming live status as it works — and a Stop that actually ends the run.
GitLane talks to agents over the Agent Client Protocol: your own already-signed-in CLI, launched as a local subprocess. No GitLane account, no API key, no cloud round-trip — whatever subscription you already pay for is what answers. Fifteen adapters ship configured, including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Goose, OpenCode, Kimi, Junie, Kiro, Devin, Grok and Amp; anything else works as a custom command.
Settings → AI Agents keeps the list: pick an adapter and see live whether its launcher is on your PATH, pin a model and a reasoning effort, then reorder or disable the ones you're not using.
Turns fail closed. An agent may read, search, and think; it may run a git command only if that command is read-only and free of anything the shell could chain or redirect. Writing files and reaching the network are refused outright, nothing is approved standing for next time, and Stop kills the process group rather than just clearing the banner.
A working tree per branch — or per agent
Create a worktree from any branch, tag, or commit and open it as its own tab, with its own graph, changes, and terminal. Five branches checked out at once, no stash-and-switch dance between them.
Which is exactly what parallel coding agents need: give Claude, Codex, or Cursor a tree each and they never fight over your checkout. Branch pills in the graph show which worktree a branch is living in, with an amber dot when that tree has uncommitted work — so you can see at a glance which agent left something behind.
And when work lands in the wrong place, hand the branch off to another worktree carrying its uncommitted changes with it — stash, switch, re-apply, with a live checklist and real conflict handling if the carry collides.


The full working-tree workflow
1 fn reserve_lane(&mut self, id: Oid) -> usize {2- self.lanes.push(id);3- self.lanes.len() - 14+ if let Some(i) = self.free.pop() {5+ self.lanes[i] = Some(id);6+ return i;7+ }8 }
Unified & split diffs · syntax highlighting · stage by hunk or line
Staging workspace
Stage by file, hunk, or line. Amend, reword, and sign — all from one commit panel.
Unified & split diffs
Read changes your way, with syntax highlighting and word-level intraline diffs.
Stash management
Push, pop, and inspect stashes as first-class entries right on the graph.
Integrated terminal
Real PTY tabs in the repo directory, with one-click launchers for AI coding agents. The graph stays in sync.
Always live
A filesystem watcher syncs the UI when you commit or stage from the terminal. No refresh.
See your history in lanes
A ~10 MB native download. Free and open source under GPL-3.0.