A conflict is an object, not a broken checkout
Why your tree still builds, and what is actually blocked.
Written By Dustin
Last updated 10 minutes ago
In Git a conflict is a failure state: the merge stops, your files are rewritten with marker lines, and you cannot do much until you have dealt with it.
In TOVIO the merge succeeds and records a conflict object. Your files are not rewritten. Your tree still builds.
It is a real object in the store
A conflict is a first-class object with its own type tag, kept in the content-addressed object store alongside blobs, trees and commits. A tree refers to it as an entry whose kind is conflict, which makes "does this commit contain a conflict?" a structural question with an exact answer: a tree is conflict-free when no entry beneath it, transitively, is a conflict entry.
Because it is an ordinary object, it syncs. A conflict you push is a conflict your teammate receives, along with all three sides — rather than something they have to reproduce by repeating your merge and hoping they get the same result.
What that changes in practice
- You can keep working, switch lanes, and commit while a conflict is open.
- All three sides stay readable in full —
tovio cat <path> --side ours|theirs|base— rather than being mashed into one file. - A conflict cannot be "accidentally committed" with markers still in it, because the markers were never written.
Creating a conflict is not an error
A merge that produces conflicts exits 0 and reports them as a result, not an error. That is deliberate rather than lenient: the merge genuinely completed, and the conflict is its output.
What is blocked
Landing, and only in specific ways:
tovio landrefuses to start from a tip that already carries unresolved conflicts.- A land that produces conflicts onto a protected lane is refused with
TVO-CONFLICT-003, and nothing is written. A protected lane must only ever point at a conflict-free commit. - A land that produces conflicts onto an ordinary lane succeeds, exits
0, and stores the conflicts in the resulting commit.
Everything else — committing, switching, syncing, building — keeps working.
Start here
tovio conflicts