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.
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.
$ bscope change conflicts 9 --wait#9 Add invoice drafts: feature/drafts against mainMerge base 1a2b3c4d, main at 9c1d22a0, this change at 7e4f0b12.Both sides touched: nothingTextual conflicts: none, the text merges cleanlySemantic conflicts: 1 conflictcreateInvoice() 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.
createInvoice() was renamed to issueInvoice() on main, and this change adds a use of it
Open a change against a moving branch
Push a branch, let main move on, and open the change's Conflicts tab.