Semantic Conflict
Two changes that merge cleanly and are incompatible in meaning.
A semantic conflict is an incompatibility between two changes that a textual merge cannot see. Neither touches the same lines, so nothing conflicts, and the combined result is broken.
The canonical examples are mundane. One change renames a value; another adds a caller using the old name — merged, the caller is broken. One change edits a shared string; another adds an assertion naming the old string — merged, the assertion fails. One change relaxes a field to optional; code written elsewhere in the meantime reads it as required — merged, the type checker fails on files neither change touched.
The important consequence for delivery: per-change validation cannot catch this. Two changes can each be entirely green and still break combined, and no individual check will ever show it. The only thing that finds a semantic conflict is validating the combination — which is what a Merge Train does, and what a naive back-to-back merge of several green changes does not.
Type systems catch a good share of them, which is a strong argument for them at scale. Tests catch some more. The residue is why integrating frequently, per Trunk-Based Development, is not merely a preference: the smaller the divergence, the fewer chances for two intentions to drift apart unobserved.
See also7
Hand-picked in the note itself — the neighbours worth reading next.
Three-Way Merge
Combining two lines of work by comparing both against their common ancestor.
Version Control & Delivery11 connections
Merge Train
Validating changes against the state they will actually merge into, in order, rather than in isolation.
Version Control & Delivery9 connections
Continuous Integration
Automatically building and testing every change, so integration problems surface immediately.
Version Control & Delivery17 connections
Regression
A previously working behaviour that a change has broken.
Method16 connections
Merge Conflict
Overlapping changes that a merge cannot combine automatically, requiring a decision.
Version Control & Delivery8 connections
Rebase
Replaying a branch's commits onto a new base, producing new commits with the same changes.
Version Control & Delivery10 connections
Schema Drift
Divergence between a schema and the code, types, or documentation that describe it.
Data & Content9 connections
Related2
Nearby in the graph rather than deliberately chosen. Looser, sometimes surprising.
Linked from11
Notes elsewhere in the wiki that reach for this one.
- Branching ModelVersion Control & Delivery
The convention governing what branches exist, what they mean, and how work reaches production.
- Continuous IntegrationVersion Control & Delivery
Automatically building and testing every change, so integration problems surface immediately.
- DeprecationMethod
Marking something as superseded and scheduled for removal, without removing it yet.
- Merge ConflictVersion Control & Delivery
Overlapping changes that a merge cannot combine automatically, requiring a decision.
- Merge TrainVersion Control & Delivery
Validating changes against the state they will actually merge into, in order, rather than in isolation.
- RebaseVersion Control & Delivery
Replaying a branch's commits onto a new base, producing new commits with the same changes.
- RegressionMethod
A previously working behaviour that a change has broken.
- Schema DriftData & Content
Divergence between a schema and the code, types, or documentation that describe it.
- Stacked Pull RequestsVersion Control & Delivery
A chain of dependent changes, each reviewed separately and merged in order.
- Three-Way MergeVersion Control & Delivery
Combining two lines of work by comparing both against their common ancestor.
- Trunk-Based DevelopmentVersion Control & Delivery
Everyone integrating into one shared branch continuously, with short-lived feature branches.