Doteraz sme predpokladali, že Git vie zmeny vždy bez problémov skombinovať. Niekedy to tak ale nie je - ak sa dve rôzne verzie súboru líšia na tom istom mieste, Git si sám nevie vybrať, ktorú z nich použiť. Tejto situácii hovoríme konflikt.
Konflikt nastáva vždy, keď Git kombinuje históriu z dvoch zdrojov (napríklad pri merge, alebo - ako uvidíme
v ďalšej lekcii - pri rebase) a:
flowchart TD
A["main: riadok = 'Ahoj svet'"] --> B["Zmena A: riadok = 'Ahoj Slovensko'"]
A --> C["Zmena B: riadok = 'Cau svet'"]
B --> D{"Git kombinuje obe zmeny"}
C --> D
D --> E["Konflikt! Git nevie sám vybrať správnu verziu"]
Keď Git narazí na konflikt, nevzdá sa - zapíše do súboru obe verzie oddelené špeciálnymi značkami a rozhodnutie nechá na tebe:
<<<<<<< HEAD
riadok = "Ahoj Slovensko"
=======
riadok = "Cau svet"
>>>>>>> aebabf5 (Zmena pozdravu)
<<<<<<< HEAD a ======= je verzia, ktorá je aktuálne u teba (HEAD)======= a >>>>>>> je verzia z commitu, ktorý sa Git snaží skombinovaťDôležité: Konflikt nie je chyba ani niečo, čoho sa treba báť. Je to úplne bežná súčasť práce s Gitom, obzvlášť keď na jednom projekte pracuje viacero ľudí súčasne.
Konflikt vyriešiš tak, že súbor ručne upravíš do finálnej podoby - vyberieš jednu z verzií, obe skombinuješ, alebo
napíšeš niečo úplne nové - a odstrániš všetky tri značky (<<<<<<<, =======, >>>>>>>).
Napríklad:
riadok = "Ahoj Slovensko"
Po úprave súbor označíš ako vyriešený pomocou git add a pokračuješ ďalej - ako presne pokračovať pri
interaktívnom rebase, si ukážeme v nasledujúcich dvoch lekciách.
Tip: Väčšina moderných editorov a IDE (napríklad IntelliJ, VS Code) vie konflikty zobraziť prehľadnejšie, s tlačidlami “Accept current”, “Accept incoming” alebo “Accept both” - nemusíš teda značky mazať úplne ručne.