PHP Toolkit

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.

See also