Git Alternatives for AI-Safe Concurrent Version Control

The core problem: Git's staging area (.git/index) is a single global file per worktree. When multiple AI agent sessions run git add / git commit concurrently, they race on this shared resource -- one session can accidentally commit another's staged files, or overwrite the index mid-operation. Worktrees are the standard mitigation but add complexity and have their own edge cases (stale lock files, orphan branches).

This document surveys four tools that either solve this problem architecturally or could serve as a foundation for a safer git workflow.

Summary Table

ProjectLanguageTypeStartedMaintainersActivitySolves AI Staging RacesStars
Jujutsu (jj)RustCLI tool2019 (Google)7 maintainers, 332 contributors, 1/3 cap per companyMonthly releases, v0.40.0, own conferenceYes -- no index, lock-free op log, conflicts as data28.1k
GitButler (but)Rust + SvelteCLI + GUI + MCP~2023 (Scott Chacon)Commercial teamVery active, CLI shipped Feb 2026Yes -- virtual branches isolate each agent's work20.5k
Sapling (sl)Rust + PythonCLI tool2022 open-sourced (Meta)Meta source control teamActive, variesNo6.8k
go-gitGoLibrary only2015 (source{d}, now community)Individual contributors, gitsightv5.18.0, v6 alphaNo7.4k

Jujutsu (jj)

Origin and Motivation

Martin von Zweigbergk started Jujutsu as a hobby project in late 2019, with the first commit on GitHub dated December 18, 2020. Martin is a Senior Software Engineer at Google with a deeply relevant background: he contributed to Git itself from 2011-2014, then spent roughly a decade working on source control at Google (Piper, CitC, Fig -- Google's Mercurial integration). This gives him an unusually complete view of version control: Git internals, Mercurial internals, and Google-scale proprietary VCS systems.

The motivation came from Google's monorepo evolution:

Martin wanted a system that took the best ideas from Mercurial (revsets, changeset evolution/obsolescence), Darcs/Pijul (first-class conflicts), and Git (ubiquity, storage format), then synthesized them into something new with a clean, modern design.

What started as a hobby evolved into Martin's full-time job at Google. Google is actively planning to use jj internally -- as of late 2025, Jujutsu at Google was in open beta with plans for a Linux-only general availability release in early 2026.

Maintainers and Governance

The project has a formal GOVERNANCE.md with defined roles and voting procedures. A structural safeguard: no more than 1/3 of maintainers may be employed by the same company, preventing corporate capture.

Current maintainers (7):

MaintainerCommitsAffiliation
Yuya Nishihara (yuja)3,677Independent (former Mercurial committer)
Martin von Zweigbergk (martinvonz)3,082Google
Ilya Grigoriev (ilyagr)639--
Austin Seipp (thoughtpolice)216--
Scott Taylor (scott2000)164--
Benjamin Tan (bnjmnt4n)157--
Waleed Khan (arxanas)111--

Total: 332 contributors, 11,192 commits. The top committer (Yuya Nishihara) is not a Googler. The funding model is hybrid: Martin works on it full-time at Google, but the governance docs state that "most people contributing to Jujutsu do so in their spare time."

Activity

Design Philosophy

The core principles, each deliberate and interconnected:

Divergence from Git

ConceptGitJujutsuWhy jj chose differently
Staging area/indexThree states: working dir, index, committedWorking copy IS a commit; no indexThe index is a constant source of confusion and adds no fundamental capability. Partial commits use jj split instead.
Conflict handlingBlocks operation; must resolve before continuingFirst-class data stored in commits; resolution deferredEnables auto-rebase, prevents workflow interruption.
Operation logPer-ref reflog; no atomic multi-ref undoAppend-only log of atomic operations; jj undoGit's reflog requires expert knowledge. jj makes undo trivial.
BranchesNamed refs tightly coupled to workflow; "detached HEAD" is scaryLightweight mutable labels ("bookmarks"); anonymous branches are defaultReduces friction for experimentation; name only when sharing.
Change IDsSHA hashes change on any rewriteStable change IDs survive rebase/amendRefer to a change across rewrites without tracking hash changes. Uses letters k-z to be visually distinct from git hashes 0-9/a-f.
RebaseManual, multi-step, requires --continueAutomatic; descendants rebase when ancestors changeHistory editing becomes routine.
StashSeparate git stash mechanismNot needed; just create a new commitThe working-copy-as-commit model makes stash redundant.
Undogit reset, git revert, git reflog -- each differentSingle jj undo commandOne command, one mental model.

Unique commands with no git equivalent:

AI Agent Concurrency Model

This is the most relevant aspect for safe multi-agent use:

Git Interoperability

How it works: jj git init --colocate creates a hybrid workspace with both .jj/ and .git/ directories. jj reads and writes standard git objects, refs, and commits. On every jj command, it auto-imports changes from git refs and auto-exports back.

What teammates see: Normal git commits. They have no idea you're using jj. Push/pull to GitHub/GitLab works normally.

What works:

What is missing:

Known rough edges:

Adopters

Key Resources

GitButler (but)

Origin and Motivation

GitButler was created around 2023 by Scott Chacon, co-author of the Pro Git book and former GitHub employee. The core insight: developers often work on multiple things at once (a feature, a bug fix, a refactor), but git forces you to think in terms of one branch at a time. Switching branches means stashing, committing WIP, or losing context.

GitButler introduced "virtual branches" -- multiple branches applied to the working directory simultaneously, with per-branch staging. You work on multiple features at once and GitButler assigns hunks to the right branch.

Maintainers and Funding

GitButler is a commercially backed company. The team includes Scott Chacon and a full engineering team. The project is funded as a product, not a volunteer effort. Sebastian Thiel (gitoxide creator) contracts for GitButler to integrate gitoxide into their backend.

Activity

Design Philosophy

CLI Commands

CategoryCommands
Inspectionstatus, diff, show
Branching/Committingbranch (new/list/integrate/destroy), commit, stage, unstage, merge
Commit Editingreword, amend, absorb, squash, uncommit, move, pick
Unified Operationrub (polymorphic: rub file onto commit = amend, rub commit onto commit = squash, etc.)
Stack/Branch Controlapply, unapply, mark, unmark
Remote/Forgepush, pull, fetch, forge (PR operations)
Undoundo
Conflict Resolutionresolve
AI/Agent Integrationmcp (starts an MCP server)
TUItui (full terminal UI)
Setupsetup, teardown, onboarding

Output formats: --format human (default), --format shell (scripting), --format json / --json (agent consumption).

AI Agent Concurrency Model

GitButler directly targets multi-agent use:

Git Interoperability

How it works: operates directly on a standard .git repository. Virtual branches are metadata stored in .git/gitbutler/ -- they don't alter git's data model. When you commit through but, it creates normal git commits on normal git branches.

What teammates see: normal git branches and commits. The virtual branch abstraction is local only.

What works:

What breaks or is missing:

Architecture

The core is cleanly layered and separable from the GUI:

The crates are not published to crates.io (all publish = false). To use the engine as a library, you'd depend on the Git repository source directly.

Key Resources

Sapling (sl)

Origin and Motivation

Sapling is Meta's internal source control system, open-sourced in November 2022. Its lineage traces through Meta's monorepo evolution: they started with Mercurial, then heavily modified it over years, eventually producing a system that shares Mercurial's heritage but diverges significantly. Sapling was designed for Meta's monorepo scale (millions of commits, millions of files) with a focus on stacked diffs workflows (integrated with Phabricator/Differential).

Maintainers and Funding

Developed by Meta's source control team. The project is funded by Meta's internal needs. The main risk for external users: community contributions may be deprioritized relative to Meta's internal roadmap, and the project's long-term maintenance outside Meta is uncertain.

Activity

Open Source Status

The sl CLI is 100% open source. There are no closed-source components in the distributed builds. The codebase uses #[cfg(fbcode_build)] conditional compilation to separate Meta-internal code paths from open-source paths -- when built outside Meta's build system, inert OSS stubs are used. No telemetry is sent to Meta; the sampling system writes to a local file only.

Components that are source-available but unsupported externally:

Neither Mononoke nor EdenFS is required for local use with Git repositories.

Design Philosophy

Divergence from Git

Sapling uses its own command syntax (sl not git). Key differences:

Git Interoperability

How it works: in .git mode, sl clone creates a repo with both .sl/ and .git/. Sapling uses git under the hood for network operations (clone/push/pull) but maintains its own internal state.

What teammates see: normal git commits and branches on the remote.

What works:

What breaks or is missing:

You are expected to pick one tool (sl or git) and stick with it on a given repo. Coexistence is possible but has documented rough edges.

AI Agent Concurrency

Sapling does not specifically address multi-agent staging races. Its simplified commit model reduces confusion but does not provide lock-free concurrency or per-agent isolation.

Key Resources

go-git

Origin and Motivation

go-git was created in 2015 by engineers at source{d}, a Madrid-based startup building ML-on-source-code tools. source{d} needed a pure Go Git implementation because their infrastructure was written in Go and they wanted to avoid CGo bindings or shelling out to git.

source{d} eventually ran into financial/legal difficulties. The go-git repository went dormant for about four months, and the community created a hard fork. The project moved to the go-git GitHub organization, where several original authors resumed maintenance. The src-d/go-git repository now contains only a redirect notice.

Maintainers and Funding

Maintained by individual contributors, including several original source{d} authors. Backed by gitsight, where go-git is described as "a critical component used at scale." No major corporate sponsor on the scale of GitHub/Microsoft or Google. Relies on community contributions.

Activity

Design Philosophy

Divergence from Git

go-git's divergence is primarily about missing features rather than behavioral differences. Where it implements a feature, it aims for behavioral compatibility.

Major gaps (as of v5.x stable):

Git Interoperability

How it works: a Go library that reads and writes standard .git repositories. Not a CLI -- your Go application calls it programmatically.

What works:

What is missing:

AI Agent Concurrency

go-git does not address multi-agent staging races. It faithfully reproduces git's index model. No worktree support means you cannot even use the standard worktree isolation strategy.

Adopters

Key Resources

Rejected Candidates

Forking C Git

The most direct approach -- fork git's C codebase and strip/modify what we don't like -- was rejected. Git is ~400k lines of C with decades of tightly intertwined internals (index, refs, pack files, hooks all cross-reference each other). Stripping features is surprisingly hard. Maintaining a fork means inheriting the entire security patch and protocol update burden, perpetually merging from upstream. No one has ever successfully forked C git and gained traction. Every successful effort has been a ground-up reimplementation.

libgit2 (C)

JGit (Java)

gitoxide / gix (Rust)

Game of Trees (C)

Pijul (Rust)

Radicle (Rust)

git-branchless (Rust)

Conclusion

For the specific problem of making git safe for concurrent AI agent sessions: