Programování

Řešení merge konfliktů v Gitu krok za krokem

Proč vznikají merge konflikty, jak číst konfliktní značky, jak je vyřešit v terminálu i VS Code a jak se jim předcházet. Včetně --ours, --theirs a abort.

12. 10. 2026 · 4 min čtení

Merge konflikt není chyba ani katastrofa. Git jen říká: „Dvě větve změnily stejné místo a já nevím, která verze je správná. Rozhodni ty.“ Tady je postup, jak konflikt v klidu vyřešit a jak jich mít méně.

Kdy konflikt vzniká

  • Dvě větve upraví stejné řádky stejného souboru.
  • Jedna větev soubor smaže a druhá ho upraví.
  • Obě větve přidají soubor se stejným názvem a jiným obsahem.

Změny v různých částech téhož souboru Git sloučí automaticky.

Konflikt se může objevit při git merge, git rebase, git pull, git cherry-pick i git stash pop.

Jak konflikt vypadá

$ git merge feature
Auto-merging config.py
CONFLICT (content): Merge conflict in config.py
Automatic merge failed; fix conflicts and then commit the result.

git status vypíše soubory v sekci „Unmerged paths“. Uvnitř souboru najdete značky:

<<<<<<< HEAD
TIMEOUT = 30
=======
TIMEOUT = 60
>>>>>>> feature
  • Mezi <<<<<<< a ======= je verze z aktuální větve (HEAD).
  • Mezi ======= a >>>>>>> je verze ze slučované větve.

Lepší přehled: styl diff3 / zdiff3

Výchozí zobrazení neukazuje, jak řádek vypadal před oběma změnami. To je přitom často klíčové. Zapněte:

git config --global merge.conflictStyle zdiff3

(zdiff3 je dostupný od Gitu 2.35, ve starších verzích použijte diff3.) Konflikt pak obsahuje i původní stav:

<<<<<<< HEAD
TIMEOUT = 30
||||||| a0c01b7
TIMEOUT = 10
=======
TIMEOUT = 60
>>>>>>> feature

Hned vidíte, že obě strany hodnotu zvýšily, a můžete se rozhodnout informovaně.

Postup řešení

  1. Zjistěte rozsah: git status nebo git diff --name-only --diff-filter=U.
  2. Otevřete každý soubor a upravte ho do finální podoby. Výsledek může být jedna verze, druhá, nebo jejich kombinace.
  3. Smažte všechny značky <<<<<<<, =======, >>>>>>>.
  4. Ověřte, že kód funguje – spusťte testy nebo aplikaci.
  5. Označte jako vyřešené a dokončete:
git add config.py
git commit            # u merge
# nebo
git rebase --continue # u rebase

Kontrola, že nikde nezůstala značka:

git diff --check
grep -rn '^<<<<<<< \|^>>>>>>> ' --include='*.py' .

Rychlé převzetí jedné strany

Když víte, že chcete celý soubor z jedné strany:

git checkout --ours   package-lock.json   # verze z aktuální větve
git checkout --theirs package-lock.json   # verze ze slučované větve
git add package-lock.json

Pozor: při rebase jsou role prohozené. „Ours“ je větev, na kterou rebasujete (např. main), a „theirs“ jsou vaše přesazované commity.

U lockfilů (package-lock.json, poetry.lock) je často nejjednodušší převzít jednu verzi a lockfile znovu vygenerovat (npm install, poetry lock).

Řešení ve VS Code

VS Code konflikty zvýrazní a nad každým nabídne tlačítka Accept Current Change, Accept Incoming Change, Accept Both Changes. Novější verze mají i třípanelový Merge Editor (tlačítko „Resolve in Merge Editor“), kde vidíte obě strany a výsledek zvlášť. Git můžete nastavit, aby VS Code používal jako mergetool:

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
git mergetool

Couvnutí, když to nejde

Není ostuda začít znovu:

git merge --abort
git rebase --abort
git cherry-pick --abort

Repozitář se vrátí do stavu před operací.

Konflikt typu „deleted by them“

CONFLICT (modify/delete): utils.py deleted in feature and modified in HEAD.

Rozhodněte se, zda soubor ponechat (git add utils.py), nebo smazat (git rm utils.py).

Jak konfliktů mít méně

  • Krátce žijící větve. Čím déle větev žije, tím víc se od main vzdálí.
  • Pravidelně si aktualizujte větev z main (git pull --rebase origin main nebo merge).
  • Jednotné formátování – Prettier, Black, gofmt. Konflikty kvůli mezerám a uvozovkám pak zmizí.
  • Menší soubory a moduly. Jeden obří utils.js je magnet na konflikty.
  • Domluva v týmu, kdo zrovna refaktoruje sdílenou část.
  • git rerere (git config --global rerere.enabled true) zopakuje vaše dřívější řešení stejného konfliktu.

Tip

Pokud konflikt nedává smysl, protože nevíte, proč která strana změnu udělala, podívejte se do historie: git log --merge -p soubor ukáže commity z obou větví, které se souboru týkají. A pokud pracujete v Projektu v ColdHost AI, můžete obě verze vložit do chatu v režimu Programování a nechat si navrhnout sloučenou podobu – výsledek ale vždy ověřte testy.