Comparison

Worktree managers, whole-tree CoW clones, and what each one leaves you holding.

Running several agents at once turned "a second checkout" into a category, and most of it is built on git worktree. The table is what a new checkout arrives holding.

historysubmodulesignored files, dependencies, build outputbranch namespace and stash
git clonecopied over the networkcloned again on requestgoneits own
git worktreesharedarrive uninitialisedgoneshared with every other worktree
worktree managersshareduninitialised, unless the tool adds a stepa configured copy step, reflinked where it can beshared
whole-tree CoW clonescopied by the filesystemcopied, handling variescarried, often as symlinksits own
gittocopied by the filesystemcopied, at every depth, and re-addressedcarried, as clones of the blocksits own

worktrunk, Conductor, ccmanager and Claude Code's own isolation: worktree are worktree managers: they address worktrees by branch name, give each agent a session, and inherit what a worktree is. worktrunk reflinks the ignored directories through a copy-ignored step, which is the same filesystem call gitto makes, applied to the part of the checkout git was told to ignore.

cow is the nearest thing to gitto: whole-tree clonefile on APFS, .git and ignored files included, with create, list, remove, sync and gc.

What is left after the copy

Copying is the part everything here agrees on. What separates them is what they do about a directory that still remembers where it used to live.

gittoworktree managerswhole-tree CoW clones
core.hooksPath, inherited worktree registrations, submodule gitdir markersre-addressed, at every submodule depthnot applicable, the worktree is registeredvaries
dependencies in the new checkoutclones of the blocks, independent from the first writecopied or reflinked by a declared stepoften symlinked into the source, and made independent on request
a filesystem that cannot share blocksrefused, after measuring a 32 MB probecopies in fullwarns and copies in full
removing a checkout that still holds workrefused, or archived to a verified bundlegit worktree remove refuses a dirty treeprompts, and --force overrides
work committed inside a submodule and pushed nowherecounted, and it stops the removalnot countednot counted
two runs touching the source at oncea lock the source carriesnonenone
a checkout that already existsgitto adopt converts a worktree in placeit is already a worktreenot applicable

A symlinked dependency directory is the difference worth naming. It makes the new checkout cheap in the same way a clone of the blocks does, and it leaves two checkouts writing into one directory. A process that resolves the path it is given, a container mount, or anything that reads through /proc will see the source's path rather than the lane's.

What it does not try to be

gitto makes checkouts. It has no session manager, no diff viewer, no pull request flow, and no opinion about which agent runs where. A worktree manager that wants cheaper checkouts can call it in place of git worktree add.

It also refuses to run where the filesystem cannot share blocks, which is ext4 and tmpfs, and ext4 is the installer default on Ubuntu and Debian. A worktree manager works there. This does not.

On this page