Git Conflicts
Status
!bun ${CLAUDE_PLUGIN_ROOT}/skills/conflicts/scripts/status.ts
Context
!bun ${CLAUDE_PLUGIN_ROOT}/skills/conflicts/scripts/context.ts
Upstream
!bun ${CLAUDE_PLUGIN_ROOT}/skills/conflicts/scripts/upstream.ts
Three-Way Access
Git stores three versions in staging slots during a conflict:
| Slot | Version | Command |
|---|---|---|
:1:path |
Base (common ancestor) | git show :1:path |
:2:path |
Ours (HEAD) | git show :2:path |
:3:path |
Theirs (incoming) | git show :3:path |
Resolving
For each conflicted file:
- Read the three slots above to understand base, ours, and theirs.
- Edit the file to produce the correct merged result, then
git addit. - For generated files (lockfiles, build artifacts), delete and regenerate rather than merge by hand. Follow the project's
CLAUDE.mdfor lockfile-specific guidance. - Never silently drop either side. When in doubt, keep both and ask.
- If a conflict is in a file you don't understand, ask rather than guess.
Committing and Pushing
This step runs only when you are asked to take the operation to completion: the --push argument (its alias push), or a request like "fix conflicts and push". By default, on auto-activation or when asked only to resolve, stop after git add and do not commit, continue, or push.
When driving to completion:
- Initiate the merge if needed. If no rebase, merge, or cherry-pick is in progress but upstream has diverged, run
git merge origin/<default-branch>to surface conflicts. If it merges cleanly, push and finish. - Assess complexity before resolving.
- Simple (generated files only, or fewer than 3 conflicts across 1-2 files with obvious resolutions): proceed.
- Complex (3+ files, non-trivial code, or ambiguous intent): summarize the conflicts and confirm with the user via
AskUserQuestionbefore resolving.
- Resolve per the section above.
- Stash unrelated dirty files. Check
git status --porcelainfor unstaged changes beyond the resolved conflicts. Trygit stash push -m "conflicts: temp" -- <files>for all of them at once. If the stash fails (the sandbox may block unlinking protected files like.mcp.json), stash individually and skip failures. For files that cannot be stashed, hide them withgit update-index --assume-unchanged <file>. - Continue the operation with
git rebase --continue,git merge --continue, orgit cherry-pick --continue. - Push and restore. Run
git push, then restore hidden files withgit update-index --no-assume-unchanged <file>andgit stash popif anything was stashed.
References
- rerere.md — Automatic resolution reuse for repeated rebases