author

Matyáš Caras

9/13/2026 18:00

Merge conflict: strašák verzování v Gitu

Když na kódu pracujete ve více lidech, budete si ho muset mezi sebou nějak sdílet. V 99 % případů použijete Git. A tak si vesele programujete, ale nedošlo vám, že pracujete současně na stejném souboru. Teď se snažíš stáhnout změny tvého kolegy, ale vyskočí na tebe ona hláška: merge conflict. Tato hláška hned nemusí znamenat pohromu, určité konflikty umí Git vyřešit automaticky, občas si ale budeš muset takříkajíc zašpinit ruce.

Cover Image

V situaci, kdy máš nakóděno a chceš své změny nahrát do vašeho týmového repozitáře pomocí git push, na tebe může vyskočit takováto hláška:

! [rejected]       main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/vase-tda-jmeno/vas-tda-repozitar.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.

To znamená, že někdo z tvých kolegů stihl nahrát nějakou změnu, kterou u sebe nemáš. Aby se změny spojily, musíš je nejdřív k sobě stáhnout pomocí git pull. Git se pokusí změny automaticky spojit, ale pokud se mu to nepovede, vyskočí na tebe tohle:

Auto-merging index.ts
CONFLICT (content): Merge conflict in index.ts
Automatic merge failed; fix conflicts and then commit the result.

Pokud jsi s Gitem ještě nepracoval, může se poté objevit tato hláška:

hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.

Git potřebuje zjistit, jakým způsobem chceš provádět merge po stažení, jelikož na to jsou de facto tři způsoby.

Když nejsou žádné závažné změny na dané větvi, Git provádí fast-forward automaticky a nemusíš tak nic dělat. V ostatních případech přichází na řadu merge commit, nebo rebase. Rozdíly mezi nimi můžeš zjistit třeba zde, prozatím stačí vědět, že provádět rebase může být komplikovanější, a tak pro zbytek tohoto článku budu používat merge.

Ten nastavíš použitím příkazu git config pull.rebase false (případně za config dej --global, pokud to chceš nastavit jako výchozí) a zkus git pull znovu.

Manuální řešení konfliktu

Když si otevřeš soubor, ve kterém vznikl konflikt (ať už kvůli předchozímu scénáři, nebo kvůli klasickému merge jiné větve), uvidíš, že se jeho obsah přepsal na něco podobného tomuto:

image.png

Tímto Git označil konfliktní místa a vložil vedle sebe změny, které aktuálně máš u sebe (1), a změny, které se snažíš stáhnout k sobě (2). Manuální řešení spočívá v tom, že soubor přepíšeš tak, aby obsahoval to, co tam ve finále chceš mít.

image4.gif

Jakmile budeš hotový, stačí změny přidat do fronty (git add nazev_souboru), vytvořit commit (git commit -m "zpráva") a nahrát zpět do repozitáře (git push).

Když se podíváš do svého repozitáře, uvidíš, že poslední změna bude tvůj poslední commit. Jelikož je to merge commit, bude se jevit prázdný (0 změněných souborů), tvoje změny však už jsou připravené na to, aby si je zbytek tvého týmu stáhl.

image.png

GUI nástroje: jak si ulehčit práci

Tohle bylo jednoduché na řešení manuálně, ale ve větších projektech se můžeš v případě neopatrnosti setkat i s desítkami konfliktů najednou. Řešit sedmdesát konfliktů takhle rozložených napříč X soubory a ještě to tam manuálně sázet, to určitě nikdo nechce.

Naštěstí existuje spousta nástrojů, které s těmito konflikty umí pracovat. Jeden nástroj má v sobě zabudovaný i VS Code, který možná používáš na vývoj.

image.png

Když nastane konflikt, VS Code ti soubor vybarví. To je sice pěkné, ale skutečná zábava začíná, když si rozklikneš „Merge Editor“. V něm můžeš vidět vedle sebe přicházející změny, které se chystáš stáhnout do dané větve (1), a svoje aktuální změny na dané větvi (2). Zároveň ve spodní půlce uvidíš výsledek svého mergeování (3).

V pravé části obrazovky vidíš, kolik konfliktů je ještě potřeba vyřešit, a kliknutím na číslo se přesuneš v kódu na ten nejbližší.

image.png

Nad každým konfliktem visí tlačítka „Accept Incoming“ / „Accept Current“ a „Ignore“. V případě, že zaklikneš „Ignore“, konflikt přestane svítit a můžeš ho vyřešit manuálně tak, jak bys byl zvyklý z předchozí sekce. Stačí začít psát do okna s výsledkem (3 na předchozím obrázku).

Když klikneš na „Accept Incoming“, připraví se k zápisu daná přicházející změna (v okně 1 výše). Pokud klikneš na „Accept Current“, tak se zapíše tvoje aktuální změna, kterou máš (v okně 2 výše).

V určitých případech se může objevit i tlačítko „Accept Combination“. Při jeho zakliknutí se Merge Editor pokusí zakomponovat obě změny tak, aby se vzájemně nepřepsaly, ale může se stát, že určité části kódu se ti tím zduplikují, tak si to nezapomeň zkontrolovat, než to pošleš ven.

Jakmile jsi se svým řešením konfliktu spokojený a čítadlo konfliktů je na nule, můžeš kliknout na „Complete Merge“. VS Code ti v záložce revizí (levý panel s Git ikonkou, případně Ctrl+Shift+G) připraví merge commit, kde stačí jen kliknout na „Continue“ a máš hotovo.

image.png

Teď už tě nic nezastaví od tvoření, takže s chutí do toho!

 

© 2026 students can grow, z.s. – Vydáno pod licencí CC BY-NC-SA 4.0.