fix-conflict
Fix Merge Conflicts
This skill automatically resolves merge conflicts for the current PR by fetching the base branch, performing a test merge, analyzing conflicting files, and applying resolutions.
Usage
/fix-conflict # Auto-resolve merge conflicts
/fix-conflict --dry-run # Show conflicts without resolving
Workflow
Step 1: Determine PR and Base Branch
Get the current branch and PR details:
git rev-parse --abbrev-ref HEAD
gh pr view --json baseRefName,number,url -q '{base: .baseRefName, number: .number, url: .url}'
If no PR exists, report "No PR found for the current branch. Nothing to resolve." and stop.
Step 2: Fetch Latest Remote State
git fetch origin
Step 3: Attempt Test Merge
Start a non-committing merge to identify conflicts:
git merge --no-commit --no-ff "origin/<base-branch>"
If the merge completes without conflicts:
- Run
git merge --abortto undo the test merge - Report "No merge conflicts detected. The PR is mergeable." and stop.
If the merge fails with conflicts, proceed to the next step.
Step 4: Identify Conflicting Files
git diff --name-only --diff-filter=U
This lists all files with unresolved conflicts.
For each conflicting file, check if it's a binary file:
file <path>
If binary files have conflicts:
- Abort the merge:
git merge --abort - Report "Binary file conflicts detected in: . These require manual resolution." and stop.
Step 5: Resolve Conflicts
For each conflicting file:
- Read the entire file to see the conflict markers (
<<<<<<<,=======,>>>>>>>) - Understand the changes from both sides:
- The current branch's changes (between
<<<<<<<and=======) - The base branch's changes (between
=======and>>>>>>>)
- The current branch's changes (between
- Determine the correct resolution:
- If both sides modify different parts of the same function: keep both changes
- If both sides modify the same lines: analyze the intent and merge logically
- If one side adds new code and the other modifies existing: keep both
- If changes are contradictory: prefer the current branch's intent (it's newer work)
- Remove all conflict markers and write the resolved content
- Stage the resolved file:
git add <file>
Important constraints:
- Never blindly choose one side — always analyze both changes
- Preserve formatting and style consistency
- If a conflict is too complex to resolve confidently (e.g., large architectural changes on both sides), abort and report for manual resolution
If --dry-run flag is provided: show each conflict with both sides and the proposed resolution, but do NOT modify files, commit, or push.
Step 6: Local Verification
After resolving all conflicts, verify the merge is clean:
ruff check synapse/ tests/
ruff format synapse/ tests/ --check
pytest
If any check fails:
- Attempt one targeted fix for the issue
- If it still fails, abort the merge and report what went wrong
Step 7: Complete Merge and Push
git commit -m "merge: resolve conflicts with <base-branch>"
git push
Report a summary:
- Number of files with conflicts resolved
- List of resolved files
- Whether all local checks pass
Step 8: Error Handling
- Abort on failure: If resolution fails at any point, always run
git merge --abortto return to a clean state - Binary conflicts: Report and stop — do not attempt to resolve binary files
- Too many conflicts (>10 files): Report and suggest manual resolution
- Max 1 attempt: This skill attempts resolution once. If it fails, manual intervention is needed
- Never force-push: Always use
git push, nevergit push --force
Safety
- The test merge (
--no-commit --no-ff) ensures we can always abort cleanly git merge --abortis the escape hatch at every step- Local verification (ruff, pytest) before pushing ensures we don't push broken code
- Binary files are never auto-resolved