Your entire git universe, on a grid.
Branches on the Y axis. Commits on the X axis. Every state your repo has ever been in is a coordinate — searchable, inspectable, and safe to manipulate. Merges, rebases, and cherry-picks run as animated dry runs first, so you see exactly what will happen — including every conflict — before anything is real.
X → commit history
Y ↓
main ●───●───●───────● ⌖ YOU ARE HERE
\
feature/A ●───●────●───● drag a lane onto another = merge (simulated first)
feature/B ────●───● shift-drag a commit = cherry-pick
go install github.com/wolfigs/gitparallax/cmd/gitparallax@latest
gitparallax ui # open the grid for the current repo
gitparallax ui ~/code/myrepo # or any repoRequires git ≥ 2.38 on PATH (simulation uses git merge-tree --write-tree).
New to git, or teaching someone? Generate the interactive tutorial repo:
gitparallax sandbox ~/git-playground
gitparallax ui ~/git-playgroundThree lanes, one guaranteed-clean merge, one guaranteed conflict — drag them and watch what git actually does.
| Action | How | What happens |
|---|---|---|
| Navigate | drag to pan, ⌘-scroll to zoom | 60 fps canvas over thousands of commits |
| Search the universe | search bar: message / author / sha / path / code (-S) | matching coordinates glow; Enter flies between them |
| Inspect a coordinate | click any commit | subject, author, lanes containing it, files with churn |
| N-way file lineage | click a file in the inspector | the same file across all lanes — shared regions collapsed, divergent regions stacked per branch |
| Merge | drag a lane label onto another lane | animated dry run: base found, per-file clean/conflict, verdict |
| Rebase | right-click lane → rebase onto | ghost commits lift and replay one by one; stops red on the conflicting commit |
| Cherry-pick | shift-drag a commit to a lane | single-commit dry run with the same treatment |
| Apply for real | the button appears only when the dry run is clean | runs in a throwaway worktree — your checkout is never touched |
| Undo | History panel → Undo | every operation is journaled with pre-op SHAs; rollback is one guarded update-ref |
| Understand | Explain toggle | every simulation step narrated in plain language |
| Spot rot | Drift toggle | lanes heat up by divergence (line churn × staleness) |
- Simulate first, always. Real operations refuse to run if their dry run conflicts. Simulations use
merge-treeand syntheticcommit-treeobjects — no ref moves, no working-tree writes. - Your checkout is sacred. Real operations run in temporary worktrees. Operations targeting the branch you have checked out are refused, not sneaked behind your back.
- Journal before mutate. Pre-op SHAs are appended to
~/.gitparallax/transactions.jsonlbefore any ref moves. Rollback uses compare-and-swapupdate-refand refuses if the branch has moved since.
One Go binary, zero runtime dependencies beyond git itself:
cmd/gitparallax CLI: ui | serve --stdio | sandbox
internal/gitx git plumbing: graph+lanes, search, lineage (Myers/patience),
merge-tree simulation, worktree ops, transaction journal
internal/rpc JSON-RPC 2.0 dispatcher (stdio + HTTP transports)
internal/httpui localhost server for the embedded UI
web/ canvas grid UI (TypeScript, no framework, ~18 kB)
gitparallax serve --stdio exposes the full RPC surface for editor plugins or a future desktop shell.
make ui # build web UI (Node 18+)
make build # build the binary
make test # Go e2e suite (runs against generated sandbox repos)MIT © Wolfigs