Řešení konfliktů při merge a rebase v Git bez zbytečných chyb
Konflikty při slučování větví nejsou známkou toho, že děláte něco špatně. Naopak – pokud pracujete v týmu, dřív nebo později narazíte na situaci, kdy dva lidé upravili stejný řádek nebo stejný soubor. Git pak nedokáže automaticky rozhodnout, která změna je správná, a nechá rozhodnutí na vás. Klíčové je pochopit, že merge i rebase řeší konflikty odlišným způsobem. Zatímco merge vytvoří nový commit a historii zachová tak, jak se skutečně vyvíjela, rebase přepisuje historii a konflikty řeší postupně po jednotlivých commitech. To s sebou nese větší riziko chyb, zejména pokud rebasujete větev, kterou už někdo jiný stáhl k sobě.
Než se pustíte do řešení konfliktu, je dobré vědět, v jakém stavu se repozitář nachází. Příkaz git status vám ukáže, které soubory jsou v konfliktu, a git diff odhalí přesné rozdíly. V souborech najdete značky <<<<<<<, ======= a >>>>>>>, které oddělují vaše změny od změn z druhé větve. Nikdy nemažte tyto značky ručně, dokud si nejste jisti, co má výsledek obsahovat. Pokud si nejste jisti, použijte git checkout --ours nebo git checkout --theirs pro výběr jedné strany, ale pozor – při rebase je význam ours a theirs přesně opačný než při merge. Právě tady vzniká mnoho zbytečných chyb. Osvědčený postup a doporučení pro řešení konfliktů najdete v článku o Git workflow pro týmovou spolupráci, který shrnuje i to, jak se vyhnout přepisování sdílené historie.
Po vyřešení všech konfliktů je nutné přidat soubory do indexu pomocí git add. Při merge pak stačí dokončit sloučení příkazem git commit, při rebase použijete git rebase --continue. Pokud si u rebase nejste jisti, můžete kdykoli použít git rebase --abort a vrátit se do původního stavu. Před každým rebasem si vytvořte záložní větev nebo alespoň vězte, že git reflog vám pomůže najít ztracené commity. Vyhněte se rebasování větve, na které pracuje někdo jiný – to je nejčastější zdroj zmatku a konfliktů, které se opakují. Místo toho rebasujte pouze svou lokální větev před jejím odesláním do vzdáleného repozitáře.
Zbytečným chybám se dá předejít i prevencí. Pravidelně synchronizujte svou větev s hlavní větví, commitujte menší logické celky a pište výstižné zprávy. Pokud víte, že někdo jiný pracuje na stejném souboru, domluvte se předem. Ať už zvolíte merge nebo rebase, vždy si předem rozmyslete, jaký dopad to bude mít na historii a na vaše kolegy. Konflikty jsou přirozenou součástí vývoje a jejich zvládnutí patří k základním dovednostem každého vývojáře.