From agent-almanac
Resolves Git merge, rebase, cherry-pick, and stash pop conflicts by identifying sources, reading markers, editing resolutions, and safely continuing or aborting operations.
npx claudepluginhub pjt222/agent-almanacThis skill uses the workspace's default tool permissions.
---
Resolves Git merge and rebase conflicts efficiently using bulk strategies like `git checkout --theirs/--ours` over manual conflict marker editing. Activates on merge/rebase conflicts.
Analyzes git merge conflicts by type and context, proposes automated/manual resolutions, and validates fixes. Handles content, structural, semantic, and formatting issues.
Resolves Git merge and rebase conflicts file-by-file using modern tooling. Activates for conflicted merges, rebases, PRs unable to merge, or diverged branches. Supports --ours, --theirs, auto-push.
Share bugs, ideas, or general feedback.
Identify, resolve, and recover from merge and rebase conflicts.
git merge or git rebase reports conflictsgit cherry-pick cannot apply cleanlygit pull results in conflicting changesgit stash pop conflicts with current working treeDetermine what operation caused the conflict:
# Check current status
git status
# Look for indicators:
# "You have unmerged paths" — merge conflict
# "rebase in progress" — rebase conflict
# "cherry-pick in progress" — cherry-pick conflict
The status output tells you which files have conflicts and what operation is in progress.
Expected: git status shows files listed under "Unmerged paths" and indicates the active operation.
On failure: If git status shows a clean tree but you expected conflicts, the operation may have already been completed or aborted. Check git log for recent activity.
Open each conflicting file and locate the conflict markers:
<<<<<<< HEAD
// Your current branch's version
const result = calculateWeightedMean(data, weights);
=======
// Incoming branch's version
const result = computeWeightedAverage(data, weights);
>>>>>>> feature/rename-functions
<<<<<<< HEAD to =======: Your current branch (or the branch you're rebasing onto)======= to >>>>>>>: The incoming changes (the branch being merged or the commit being applied)Expected: Each conflicting file contains one or more blocks with <<<<<<<, =======, and >>>>>>> markers.
On failure: If no markers are found but files show as conflicting, the conflict may be a binary file or a deleted-vs-modified conflict. Check git diff --name-only --diff-filter=U for the full list.
Manual merge (most common): Edit the file to combine both changes logically, then remove all conflict markers.
Accept ours (keep current branch's version):
# For a single file
git checkout --ours path/to/file.R
git add path/to/file.R
# For all conflicts
git checkout --ours .
git add -A
Accept theirs (keep incoming branch's version):
# For a single file
git checkout --theirs path/to/file.R
git add path/to/file.R
# For all conflicts
git checkout --theirs .
git add -A
Expected: After resolution, the file contains the correct merged content with no remaining conflict markers.
On failure: If you chose the wrong side, re-read the conflicting version from the merge base. During a merge, git checkout -m path/to/file re-creates the conflict markers so you can try again.
After editing each conflicting file:
# Stage the resolved file
git add path/to/resolved-file.R
# Check remaining conflicts
git status
Repeat for every file listed under "Unmerged paths".
Expected: All files move from "Unmerged paths" to "Changes to be committed". No conflict markers remain in any file.
On failure: If git add fails or markers remain, re-open the file and ensure all <<<<<<<, =======, and >>>>>>> lines are removed.
Once all conflicts are resolved:
For merge:
git commit
# Git auto-populates the merge commit message
For rebase:
git rebase --continue
# May encounter more conflicts on subsequent commits — repeat steps 2-4
For cherry-pick:
git cherry-pick --continue
For stash pop:
# Stash pop conflicts don't need a continue — just commit or reset
git add .
git commit -m "Apply stashed changes with conflict resolution"
Expected: The operation completes. git status shows a clean working tree (or moves to the next commit during rebase).
On failure: If the continue command fails, check git status for remaining unresolved files. All conflicts must be resolved before continuing.
If resolution is too complex or you chose the wrong approach, abort safely:
# Abort merge
git merge --abort
# Abort rebase
git rebase --abort
# Abort cherry-pick
git cherry-pick --abort
Expected: Repository returns to the state before the operation started. No data loss.
On failure: If abort fails (rare), check git reflog to find the commit before the operation and git reset --hard <commit> to restore it. Use with caution — this discards uncommitted changes.
After the operation completes:
# Verify clean working tree
git status
# Check that the merge/rebase result is correct
git log --oneline -5
git diff HEAD~1
# Run tests to confirm nothing is broken
# (language-specific: devtools::test(), npm test, cargo test, etc.)
Expected: Clean working tree, correct merge history, tests pass.
On failure: If tests fail after resolution, the merge may have introduced logical errors even though syntax conflicts are resolved. Review the diff carefully and fix.
<<<<<<<, =======, >>>>>>>) remain in any filegit status shows a clean working treegit log--ours or --theirs discards the other side entirely. Only use when you are certain one version is completely correct.--amend unless the rebase step specifically calls for it. Use git rebase --continue instead.git rebase --abort and git merge --abort discard all resolution work. Only abort if you want to start over.commit-changes - committing after conflict resolutionmanage-git-branches - branch workflows that lead to conflictsconfigure-git-repository - repository setup and merge strategies