Skip to main content
Coming from Git

Branches are called lanes

The rename, and the more important thing underneath it.

Written By Dustin

Last updated About 1 month ago

tovio lane is what you would call git branch. The rename exists because the underlying object is genuinely different.

A lane is a CRDT reference

A Git branch is a pointer, and two people moving it independently produce a conflict that one of them must resolve by force. A lane is a conflict-free replicated reference ordered by a hybrid logical clock: two replicas that advance the same lane converge.

This is why the native path has no diverged-history error, no pull-before-you-push, and no force-push ritual.

The commands

tovio lane                 # list, marking the current one
tovio lane feature-x       # create at the current tip
tovio lane -d feature-x    # delete (undoable)
tovio switch feature-x     # move to it, carrying dirty work
tovio land --into main     # integrate

The name is one positional argument: omit it to list, give it to create, add -d (or --delete) to delete. Deleting a lane is fully undoable โ€” it never strands work โ€” and deleting the lane you are standing on is refused.

tovio branch, tovio br and tovio checkout are hidden git-compat aliases that take the same arguments and print a note. tovio checkout -b <name> creates the lane at the current tip and switches to it, and records which lane it came from so auto-sync knows its upstream.

Landing is not always a merge commit

tovio land --into main                  # the default: merge or fast-forward
tovio land lane-a lane-b --into main    # native N-way (octopus) land
tovio land --into main --dry-run --explain

--dry-run assesses the land and advances nothing; adding --explain prints the whole merge trace โ€” base, per-file algebra, and every gate. --rebase integrates by re-deriving the source onto the target instead of writing a merge commit, which gives you a linear mainline at the cost of re-signing each change as the lander. It is opt-in and two-way only, and never the default.

Tags are not lanes

A tag is immutable. Re-pointing an existing tag at a different commit is refused with TVO-TAG-001 unless you pass --force and hold the authority for it. That is deliberate: a tag that moves silently is a supply-chain problem.