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 land refuses 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