Conflict maps

See what collides before you merge

When the target branch has moved on, Branchscope compares what each side did since the merge base, element by element, as graphs derived from the code. It finds the conflicts git reports, and the ones that merge cleanly as text but don't fit together.

Both sides

Each side's changes, from the merge base

The target's changes and the change's are drawn side by side as change maps, limited to the elements both touched and what they connect to. Select one, on either side, to highlight it on both, and follow its links to the code. Conflicting files are placed on the functions and types that hold each conflicting region.

When main has moved onBoth main and the change edited the invoices code since they split.
A conflict mapA conflict mapTwo columns, main and the change. Both changed total(): main its tax option, the change its discount. main removed formatInvoice(), and the change's renderPdf() now calls it.MAINCHANGEtotal()changed: tax optiontotal()edited: discountformatInvoice()removedrenderPdf()now calls formatInvoice()

Both sides since the merge base, element by element, with code links on each side. Selecting one highlights it in both.

Semantic conflict: main removes formatInvoice(), which the change starts calling. Merges cleanly as text.

Shown as a warning in the merge box, from the same graphs as the review, before anything is merged.

Semantic conflicts

Found when the text merges cleanly

One side removes, renames or moves something and the other starts using it; one side changes a declaration, such as an endpoint's route or a table's columns, and the other adds a use of it; or both add the same element. The map is worked out whenever the target has moved past the merge base, and scripts and agents read it with bscope change conflicts, the API or the MCP tool get_conflict_map.

~/invoices
$ bscope change conflicts 9 --wait
#9 Add invoice drafts: feature/drafts against main
Merge base 1a2b3c4d, main at 9c1d22a0, this change at 7e4f0b12.
Both sides touched: nothing
Textual conflicts: none, the text merges cleanly
Semantic conflicts: 1 conflict
createInvoice() was renamed to issueInvoice() on main, and this change adds a use of it [ts:apps/web|src/lib/invoices.ts|createInvoice()]
DraftsPage() calls it at apps/web/src/app/drafts/page.tsx:14 [ts:apps/web|src/app/drafts/page.tsx|DraftsPage()]

Warnings

A warning in the merge box, never a block

Semantic conflicts are shown on the change and beside its merge button, in a sentence that names what each side did. They don't stop a merge, and nothing suggests a resolution: the map shows what each side did, and a person decides.

alice/invoices › Change #9
Merges cleanly as text, but:

createInvoice() was renamed to issueInvoice() on main, and this change adds a use of it

Merge

Open a change against a moving branch

Push a branch, let main move on, and open the change's Conflicts tab.