The mathematical difference between how Git models your history and how GitWeave does it — and why it matters for deterministic merges and AI agents. La diferencia matemática entre cómo Git modela tu historial y cómo lo hace GitWeave — y por qué importa para merges determinísticos y agentes IA.
Every Git commit is a complete snapshot of your file tree at a point in time. The diff you see in git diff is not stored — it's calculated on the fly by comparing two snapshots. The change itself doesn't exist as a first-class object.
Cada commit de Git es un snapshot completo de tu árbol de archivos en un momento dado. El diff que ves en git diff no se guarda — se calcula al vuelo comparando dos snapshots. El cambio en sí no existe como objeto de primera clase.
Click through the commits to see what Git actually stores: Haz click en los commits para ver qué guarda Git realmente:
In GitWeave, the patch is the atom. The state of the repository at any moment is derived by composing patches together. The change is what's stored; the snapshot is computed on demand — the exact inverse of Git. En GitWeave, el patch es el átomo. El estado del repositorio en cualquier momento se deriva componiendo patches entre sí. El cambio es lo que se guarda; el snapshot se computa a demanda — el inverso exacto de Git.
A patch is a partial function over lines. "Partial" means it only touches the lines it actually changes — nothing else: Un patch es una función parcial sobre líneas. "Parcial" significa que solo toca las líneas que efectivamente cambia — nada más:
This is the critical property that changes everything — independence between patches: Esta es la propiedad clave que cambia todo — independencia entre patches:
Below is a 30-line file. Each cell represents a line. Agent A and Agent B each own a set of patches — toggle them on/off and watch whether the merge is clean or conflicted. Abajo hay un archivo de 30 líneas. Cada celda representa una línea. El Agente A y el Agente B tienen cada uno un set de patches — activa/desactiva y observa si el merge es limpio o conflictivo.
In Git, a "conflict" is whatever the 3-way merge heuristic decides is ambiguous. You can have two patches that touch "nearby" lines and get a conflict even if they're logically independent. En Git, un "conflicto" es lo que la heurística de 3-way merge decide que es ambiguo. Puedes tener dos patches que tocan líneas "cercanas" y obtener un conflicto aunque sean lógicamente independientes.
In GitWeave, a conflict has a precise mathematical definition: En GitWeave, un conflicto tiene una definición matemática precisa:
And crucially: a conflict is itself a valid patch. It's an object that represents the state of indetermination. The system doesn't break — it produces a precise description of what needs resolving: Y crucialmente: un conflicto es en sí mismo un patch válido. Es un objeto que representa el estado de indeterminación. El sistema no se rompe — produce una descripción precisa de qué hay que resolver:
<<<< markers."
"Estos cambios están cerca entre sí y no puedo decidir cuál es correcto. Aquí tienes ambas versiones separadas por marcadores <<<<."
p3 and q2 both modify lines {12, 13, 14}. Intersection is non-empty. Here is the exact set."
"Los patches p3 y q2 modifican las líneas {12, 13, 14}. La intersección no es vacía. Aquí tienes el conjunto exacto."
The formal foundation comes from category theory (Mimram & Di Giusto, 2013). A merge of two patches is a pushout in the category of repository states. El fundamento formal viene de la teoría de categorías (Mimram & Di Giusto, 2013). Un merge de dos patches es un pushout en la categoría de estados del repositorio.
| ConceptConcepto | Git (snapshots)Git (snapshots) | GitWeave (patches)GitWeave (patches) |
|---|---|---|
| First-class objectObjeto de primera clase | State (snapshot)Estado (snapshot) | Change (patch)Cambio (patch) |
| Derived objectObjeto derivado | Diff (computed on demand)Diff (computado a demanda) | State (composed from patches)Estado (compuesto desde patches) |
| Identity of a changeIdentidad del cambio | Commit hash (includes tree, parent, metadata) Hash del commit (incluye árbol, padre, metadata) | blake3(content + deps) — content-addressed blake3(contenido + deps) — identificado por contenido |
| Merge modelModelo de merge | 3-way merge heuristic (find common ancestor) Heurística 3-way (busca ancestro común) | Set intersection of domains — algebraic Intersección de dominios — algebraico |
| CommutativityConmutatividad | Not guaranteed — merge(A,B) ≠ merge(B,A) No garantizada — merge(A,B) ≠ merge(B,A) | Guaranteed when dom(p)∩dom(q) = ∅ Garantizada cuando dom(p)∩dom(q) = ∅ |
| Conflict definitionDefinición de conflicto | Heuristic ambiguity near common ancestor Ambigüedad heurística cerca del ancestro común | dom(p) ∩ dom(q) ≠ ∅ — exact set of contested lines dom(p) ∩ dom(q) ≠ ∅ — conjunto exacto de líneas en disputa |
| Parallel agentsAgentes en paralelo | Must serialize through branch/merge ceremony Serialización obligatoria via ceremonia de ramas/merge | N WorkSlots — independent by construction N WorkSlots — independientes por construcción |
| Theoretical basisBase teórica | None (operational, designed by Torvalds) Ninguna (operacional, diseñado por Torvalds) | Category theory pushouts (Mimram & Di Giusto 2013) Pushouts de teoría de categorías (Mimram & Di Giusto 2013) |