Every commit graph is a DAG: each commit points to one parent (a normal commit) or two (a merge). This simulator advances that DAG in real time on a 2D plane. Main grows straight to the right; each feature branch spawns at a point on main, fans diagonally away (up or down) while adding its own commits, then attempts to merge back.
The chance a merge collides with someone else's changes grows with how long the branch has been diverged from main and how much its files overlap with everyone else's — a well-established empirically-observed relationship in software-engineering research on branch integration:
divergence d = (main commits since branch point)
P(conflict) = 1 − e^(−λ·d)
λ is the file-overlap density slider: a small team touching disjoint files (low λ) merges cleanly even after long-lived branches; a large team hammering the same files (high λ) hits conflicts fast even on short branches. This is exactly why Trunk-Based Development keeps branches alive for hours (small d), GitHub Flow for days, and Git Flow deliberately isolates long-running feature/release branches at the cost of higher conflict probability at merge time — the model you pick sets the default branch-lifetime and direct-to-main commit rate, and the readouts plus the strip chart below the graph show the resulting conflict rate and average lead time (commits-to-merge) live.
- Team size — target number of concurrently open branches.
- Branch lifetime — average commits a branch accumulates before it attempts to merge.
- λ (overlap density) — how tightly branches contend for the same files.
- A merge conflict costs an extra resolution commit (shown red) before the branch integrates; a clean merge (green) integrates immediately.
- Drag the graph to pan, scroll/pinch to zoom; "Re-center view" snaps the camera back to auto-follow the tip of main.