fix-backport-conflicts

star 73

Fix inline merge conflict markers in backport PRs by resolving conflicts and recommitting cleanly with original metadata preserved. Use when a backport PR has unresolved conflict markers, a cherry-pick produced merge conflicts, or a PR has the 'conflicts' label and needs to be made ready for review. Supports bulk mode for multiple PRs.

scylladb By scylladb schedule Updated 3/29/2026

name: fix-backport-conflicts description: >- Fix inline merge conflict markers in backport PRs by resolving conflicts and recommitting cleanly with original metadata preserved. Use when a backport PR has unresolved conflict markers, a cherry-pick produced merge conflicts, or a PR has the 'conflicts' label and needs to be made ready for review. Supports bulk mode for multiple PRs. disable-model-invocation: true argument-hint: [PR-number...]

Fix Inline Conflicts in Backport PR

You are fixing inline merge conflict markers (<<<<<<<, =======, >>>>>>>) that were left in commits of a backport PR. The goal is to resolve the conflicts and produce clean commits with original authorship and messages preserved.

Input

  • $ARGUMENTS — one or more PR numbers to fix (e.g. 13920 or 13920 13921 13925)

Dispatch — ALWAYS use a subagent

Every PR MUST be dispatched to a subagent with isolation: "worktree". Never run the workflow in the current working directory — it checks out branches, resets HEAD, and rewrites commits, which would destroy any in-progress work. The worktree gives each PR a completely isolated git state.

For each PR number in $ARGUMENTS, launch a parallel Agent with:

  • isolation: "worktree"
  • subagent_type: "general-purpose"
  • A prompt containing: the PR number, and the full Workflow below (copy it into the prompt)

After all subagents complete, summarize which PRs succeeded and which failed or had ambiguous conflicts requiring user input. Remind the user to review the changes.

Helper Script

All dangerous git operations (rebase, reset, commit --no-verify, force-push) are wrapped in .claude/scripts/fix-backport.sh. This script is the ONLY command allowed in project permissions, keeping the blast radius small. Available subcommands:

Subcommand Purpose
checkout <PR> Checkout PR branch, print base/head/headRepoOwner as JSON
rebase <BASE_REF> Fetch latest base branch and rebase PR onto it
rebase-continue Continue rebase after resolving conflicts
resolve-commit Stage all + temp commit (--no-verify)
prepare-recommit <BASE_REF> Tag resolved tree, hard-reset to base for clean recommit
recommit <HASH> Copy files from resolved tree for one commit, commit with original author
push <REMOTE> <BRANCH> Force-push with --force-with-lease
update-pr <PR> Remove conflicts label + mark ready
verify Check no conflict markers remain

Workflow (executed by the subagent inside its worktree)

All commands run from the worktree's working directory. Never use git -C.

1. Checkout the PR

.claude/scripts/fix-backport.sh checkout $PR_NUMBER

This prints JSON with base, head, and headRepoOwner fields. Save all three. The headRepoOwner is the git remote name to push to (e.g. scylladbbot, not origin). Backport PRs are typically created by bots on their own forks.

2. Rebase onto the latest base branch

.claude/scripts/fix-backport.sh rebase upstream/<baseRefName>

This fetches the latest state of the base branch and rebases the PR commits onto it. Rebasing BEFORE resolving conflicts ensures we work against the current target code. If we resolved first and rebased after, the rebase could introduce new conflicts, requiring double work.

If the rebase prints REBASE_OK: The PR is now up to date with the base. Proceed to step 3.

If the rebase prints REBASE_CONFLICTS: The rebase stopped because git couldn't auto-resolve the cherry-pick against the latest base. This is the expected case for backport PRs with the conflicts label. The conflicted files are in the working tree. Skip to step 3 (the conflict markers are already there from the rebase).

3. Check for inline conflict markers

.claude/scripts/fix-backport.sh verify

If it prints "CLEAN", the rebase resolved everything automatically. Run rebase-continue if needed, then skip to step 7 (push).

4. Understand each conflict

Read each conflicted file. For each conflict block, identify:

  • HEAD side — changes already in the base branch
  • Incoming side — changes from the cherry-picked/backported commit
  • Parent (if diff3) — the common ancestor version

Determine the correct resolution by combining both sides:

  • Keep new features/fixes from both HEAD and the incoming change
  • Use the incoming commit's architectural approach when that's the purpose of the backport
  • Preserve additions from HEAD that don't conflict with the incoming approach

5. Resolve the conflicts

Edit the files to remove all conflict markers and produce the correct merged code. Then verify:

.claude/scripts/fix-backport.sh verify

Must print "CLEAN" before proceeding.

Then complete the rebase:

git add <resolved-files>
.claude/scripts/fix-backport.sh rebase-continue

If there are multiple commits being rebased and the next one also has conflicts, repeat steps 3-5 for each.

6. Verify the result

After the rebase completes:

.claude/scripts/fix-backport.sh verify
git log --oneline upstream/<baseRefName>..HEAD
git show --stat HEAD

Confirm:

  • No conflict markers remain
  • Commit count matches the original PR
  • Each commit's --stat matches expected files (compare with parent PR if needed)
  • No files outside the original commit's scope are included

7. Push and update PR

.claude/scripts/fix-backport.sh push <headRepoOwner> <headRefName>
.claude/scripts/fix-backport.sh update-pr $PR_NUMBER

CRITICAL: Use headRepoOwner from step 1 as the remote — NOT origin. Backport PRs are created by bots (e.g. scylladbbot) on their forks. Pushing to origin goes to the wrong fork and leaves the PR unchanged.

Important rules

  • Always dispatch to a worktree subagent — never run the workflow in the current working directory
  • Always rebase onto the latest base branch first — resolving stale conflicts wastes work if the rebase introduces new ones
  • Use .claude/scripts/fix-backport.sh for all dangerous operations — raw git reset/commit --no-verify/push are not in the permission allowlist
  • Never use git stash — stashes are global across worktrees
  • Never use git -C — all commands run from the worktree working directory
  • Verify file scope after rebase — each commit must touch ONLY the files from the original commit, nothing else
  • Never modify commit messages beyond what's needed (preserve co-author lines, cherry-pick references, etc.)
  • If a conflict resolution is ambiguous, ask the user before proceeding
Install via CLI
npx skills add https://github.com/scylladb/scylla-cluster-tests --skill fix-backport-conflicts
Repository Details
star Stars 73
call_split Forks 110
navigation Branch main
article Path SKILL.md
More from Creator