Ř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.
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í
- Zjistěte rozsah:
git statusnebogit diff --name-only --diff-filter=U. - Otevřete každý soubor a upravte ho do finální podoby. Výsledek může být jedna verze, druhá, nebo jejich kombinace.
- Smažte všechny značky
<<<<<<<,=======,>>>>>>>. - Ověřte, že kód funguje – spusťte testy nebo aplikaci.
- 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
mainvzdálí. - Pravidelně si aktualizujte větev z
main(git pull --rebase origin mainnebo 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.jsje 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.