Honest Comparison
The Record. No Adjectives.
Four version control systems. Three decades of evolution. One table.
CVS (1990) · Git (2005) · Mercurial (2005) · Graf (2026)
| Feature | CVS | Git | Mercurial | Graf |
|---|---|---|---|---|
| Storage model | RCS deltas per file | Snapshot DAG, packfiles | Revlog delta chains | Merkle DAG, BLAKE3 CIDs, CBOR |
| Content addressing | None (sequential revnums) | SHA-1 (SHA-256 transition) | SHA-1 nodeid | BLAKE3, prefix-sharded CAS |
| Branching | Directory copies | Lightweight refs | Named branches / bookmarks | Named refs + per-agent branches |
| Merge strategy | Manual | Recursive 3-way + rename detect | 3-way with bdiff | LCA via alternating BFS + 3-way tree+line merge |
| Timestamps | Wall clock | Wall clock + timezone | Wall clock + timezone | Three-clock: wall + Lamport + sequence (CRDT-safe) |
| Wire protocol | pserver / SSH | git:// / SSH / HTTP smart | SSH / HTTP | GTP v1.1 – unified VCS + package distribution |
| Package distribution | None | None (npm/pip/cargo separate) | None | Native: Hinge + Nip packages over same protocol |
| Identity / auth | Unix user | Author string, GPG optional | Author string | Ed25519 SoulKeyID + challenge-response. Zero PII. |
| Agent awareness | None | None | None | Native: per-agent branches, nursery supervision, policy hooks |
| Concurrency | Single-threaded, lock files | Single-threaded + index.lock | Single-threaded | M:N fiber scheduler, nursery-structured concurrency |
| Codebase | ~80K lines C | ~400K lines C | ~200K lines Python/C | ~34K lines Janus + Zig |
| Crypto | None | SHA-1 (migrating SHA-256) | SHA-1 | BLAKE3 trust root + Ed25519 signatures. SHA-1 only on the Git bridge. |
CVS counted files. Git counted snapshots. Graf counts meaning. And it does it in ~34,000 lines – including native push to its own forge – because it doesn't carry 30 years of accidental complexity.