100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Bash

Resolving Merge Conflicts

Learn how Git detects merge conflicts, how to read conflict markers, and the practical workflow for resolving them safely and finishing the merge.

BranchingIntermediate9 min readJul 9, 2026
Analogies

Resolving Merge Conflicts

A merge conflict occurs when Git cannot automatically reconcile changes from two branches to the same region of a file — for example, both branches edited the same line differently since diverging from their common ancestor. Git is conservative here: rather than guessing which change is correct, it pauses the merge, marks the affected files as conflicted, and leaves it to the developer to decide the correct outcome. Understanding this workflow removes much of the anxiety conflicts otherwise cause, because the process is mechanical and fully recoverable at every step.

🏏

Cricket analogy: Two batsmen call for the same run with contradictory calls, so the umpire pauses play and refers to the third umpire rather than guessing, forcing the batsmen to sort out the correct outcome together.

Reading conflict markers

When a conflict occurs, Git writes both versions directly into the affected file, delimited by conflict markers: <<<<<<< HEAD begins the version from your current branch, ======= separates it from the incoming version, and >>>>>>> branch-name ends the incoming branch's version. The file otherwise looks normal outside these marked regions — only the genuinely conflicting hunks are wrapped this way. Your job is to edit the file to reflect the correct final content, removing the marker lines entirely once you've decided what to keep.

🏏

Cricket analogy: A scorecard shows both the on-field umpire's original decision and the third umpire's revised call bracketed together, and the official scorer edits it down to one final ruling, removing the bracketed markers.

The resolution workflow

After a conflicted merge, git status lists every file with unresolved conflicts under 'Unmerged paths'. For each one, open the file, resolve the conflicting sections by hand (or with a merge tool via git mergetool), and once satisfied, stage it with git add <file> — staging a previously-conflicted file is how you tell Git 'this conflict is resolved.' After every conflicted file has been staged, run git commit with no message argument; Git will open an editor pre-filled with a sensible default merge commit message that you can accept or edit.

🏏

Cricket analogy: The scorer's checklist lists every disputed delivery under 'pending review'; each is settled via the third umpire, ticked off, and only once every disputed ball is ticked does the match officially resume.

bash
$ git merge feature/pricing-update
Auto-merging src/pricing/calculator.py
CONFLICT (content): Merge conflict in src/pricing/calculator.py
Automatic merge failed; fix conflicts and then commit the result.

$ cat src/pricing/calculator.py
def apply_discount(price, code):
<<<<<<< HEAD
    if code == "SAVE10":
        return price * 0.90
=======
    if code in VALID_PROMO_CODES:
        return price * DISCOUNT_TABLE[code]
>>>>>>> feature/pricing-update

# After manually merging the logic together:
$ git add src/pricing/calculator.py
$ git status
All conflicts fixed but you are still merging.

$ git commit
[main 8b1c2d3] Merge branch 'feature/pricing-update'

# To keep entirely one side's version of a conflicted file:
$ git checkout --ours src/pricing/calculator.py   # keep current branch's version
$ git checkout --theirs src/pricing/calculator.py # keep incoming branch's version
$ git add src/pricing/calculator.py

git diff during an unresolved merge shows a special combined diff format highlighting exactly which lines came from which side, and git log --merge can list the commits on both branches that touched the conflicted file, which is often faster than guessing intent from the marker text alone.

git checkout --ours / --theirs blindly picks one side wholesale for a file — it does not intelligently combine both changes. Using it without reviewing the discarded side can silently drop a teammate's work.

  • A merge conflict happens when both branches changed overlapping content in incompatible ways since diverging.
  • Git marks conflicted regions with <<<<<<<, =======, and >>>>>>> and leaves resolution to the developer.
  • git status lists all unresolved files under 'Unmerged paths' during a conflicted merge.
  • Staging a file with git add after editing it signals to Git that its conflict is resolved.
  • git commit (with no message) completes a merge once every conflict is staged, using a default merge message.
  • git merge --abort cleanly cancels an in-progress conflicted merge and restores the pre-merge state.

Practice what you learned

Was this page helpful?

Topics covered

#Bash#GitVersionControlStudyNotes#SoftwareEngineering#ResolvingMergeConflicts#Resolving#Merge#Conflicts#Reading#Git#StudyNotes#SkillVeris