Merge
Three-way merge and diff. Pluggable differ + merger + optional validator.
composer require wp-php-toolkit/merge
Content synchronization needs more than "last write wins." A Markdown file changes in Git while the same post changes in WordPress. A generated config changes through both a CLI tool and a UI. In those cases you need a common ancestor, two edited versions, and a way to explain conflicts to a human.
The Merge component provides the diff and three-way merge primitives used by those workflows. The default examples are line-oriented because that is the most familiar shape, but the strategy is intentionally pluggable: choose the differ, choose the merger, and optionally validate the merged result before accepting it.
Use the merge result to auto-accept independent edits and to show structured conflicts when a person must decide.
Diff two strings line by line
Feed two strings to LineDiffer and inspect the operations. Every get_changes() entry is a [op, text] pair.
Render a unified patch
format_as_git_patch() produces unified-patch-style output, including hunk headers — handy for emails, CI annotations, or a "what changed?" panel.
Three-way merge with no conflicts
The classic case: each branch changes a different region. Pass the common ancestor plus both edits to MergeStrategy::merge() and read the merged result.
Inspect and surface conflicts
When both sides edit the same region, the merger produces a MergeConflict. The merged content carries Git-style markers, but the structured get_conflicts() output is what you want for a UI that lets the user pick a side.
Sync a Markdown folder against an edited DB copy
A real-world scenario: posts live both in a Git-tracked Markdown folder and in WordPress, and someone edits each. Three-way-merge each post against its common ancestor.