Appendix: Resolving Merge Conflicts
Companion to the main cheat sheet. A conflict isn’t an error you broke—it’s Git saying “two changes touched the same lines, you decide which wins.”
When conflicts happen
When you merge (or pull/sync) and both sides changed the same lines of the same file. Most common moments for you:
- Updating your feature branch from
dev(team flow) - Updating your fork from upstream (contributing)
- A Sync that pulls teammate work overlapping yours
If changes touched different lines, Git merges them automatically—no conflict. Conflicts are only the genuine overlaps.
What you’ll see
- The merge stops partway. The app tells you there are conflicts.
- Conflicted files are flagged: C status in VS Code, or a “conflicted files” list in GitHub Desktop.
- Inside the file, Git inserts conflict markers:
<<<<<<< HEAD (Current Change)
your version of the lines
=======
the incoming version of the lines
>>>>>>> dev (Incoming Change)
- Current / HEAD = what’s on your branch (where you are).
- Incoming = what’s coming in (e.g., from
devor upstream).
Resolving in VS Code
- Open each conflicted file (they’re listed under Merge Changes in Source Control).
- VS Code shows colored blocks with clickable buttons above each conflict:
- Accept Current Change — keep yours, drop theirs
- Accept Incoming Change — keep theirs, drop yours
- Accept Both Changes — keep both (stacked; you may need to reorder)
- Compare Changes — side-by-side view to decide
- Click the right one for each conflict. The markers disappear as you resolve.
- Or edit by hand: delete the markers (
<<<<<<<,=======,>>>>>>>) and shape the lines into the final version you want. (Sometimes the answer is a blend, not one side.) - Save the file.
- Stage the resolved file (+) — this tells Git “this one’s handled.”
- When all conflicts are staged, Commit to finish the merge. VS Code pre-fills a merge commit message; just accept it.
VS Code also has a 3-way Merge Editor (a button appears: “Resolve in Merge Editor”). It shows Current, Incoming, and Result panes—nicer for messy conflicts. Same accept/blend idea, clearer layout.
Resolving in GitHub Desktop
GitHub Desktop is deliberately minimal here—it hands you off to your editor:
- After a conflicting merge, Desktop shows a banner listing conflicted files.
- Click Open in [your editor] (usually VS Code) — Desktop won’t resolve them inline.
- Resolve there using the steps above (the same conflict markers / buttons).
- Save each file.
- Back in GitHub Desktop, resolved files show a checkmark. When all are resolved, the Continue merge / Commit merge button activates.
- Click it to finish, then Push origin.
So in practice: Desktop detects, VS Code resolves. This is why the VS Code section above is the real “how.”
The mental checklist
merge → conflict → open each flagged file
→ for each conflict: pick Current / Incoming / Both, or hand-edit
→ delete all <<<<<<< ======= >>>>>>> markers
→ save → stage resolved file
all resolved → commit the merge → push
Tips & gotchas
- Don’t leave markers behind. If
<<<<<<<or=======survive into a commit, the code is broken. Search the file for<<<before committing. - “Both” rarely means literally both. Accepting both is a starting point—usually you then trim/reorder into something that actually works.
- Smaller, more often = fewer conflicts. Updating your feature branch from
devfrequently keeps each conflict tiny. Waiting until the end stacks them up. - Test after resolving. A merge can be “clean” to Git but still wrong logically—run/check your code.
- Bail-out if it’s a mess: before you’ve committed the merge, you can abort and start over.
- VS Code: … menu → Branch → Abort Merge (or Command Palette → “Git: Abort Merge”)
- GitHub Desktop: Abort merge button in the conflict banner
- This returns you to before the merge—nothing lost, try again when ready.
- Conflict status letters: VS Code marks conflicts and groups them under Merge Changes; resolved-and-staged files move out of that group.
Quick reference: the markers
| Marker | Meaning |
|---|---|
<<<<<<< HEAD |
Start of your version (Current) |
======= |
Divider between the two versions |
>>>>>>> branchname |
End of the incoming version |
Your job: delete all three markers and leave only the final lines you want.
