Úvod
git merge
příkaz pomáhá přispěvateli přidat do projektu z větve. Tento koncept je jednou ze základních myšlenek kolaborativního programování, která umožňuje více lidem pracovat na jejich části kódu bez jakýchkoli konfliktů.
Když více přispěvatelů pracuje na stejné části kódu nebo pracuje s mnoha větvemi, nutně dojde ke konfliktům při sloučení. Primární cíl git merge
je vyřešit nebo varovat o těchto konfliktech automaticky.
Tato příručka vysvětluje, co je konflikt při sloučení, a nabízí řešení, když se nevyřeší automaticky. Článek také poskytuje užitečné tipy pro předcházení konfliktům při sloučení Git.
Předpoklady
- Git nainstalován a nakonfigurován (ve Windows, Mac a Ubuntu).
- Konflikt sloučení git mezi místní a vzdálenou pobočkou.
- Přístup k terminálu nebo příkazovému řádku
- Editor Vim pro tutoriál (Chcete-li nainstalovat Vim, postupujte podle jednoho z našich průvodců:Jak nainstalovat Vim 8.2 na Ubuntu 18.04 nebo Jak nainstalovat Vim 8.2 na CentOS 7)
Co je to konflikt sloučení Git?
Při práci se systémy správy verzí, jako je Git, se většina konfliktů při sloučení vyřeší automaticky. Existují však situace, kdy git merge
není schopen vyřešit problém.
Některé příklady konfliktů sloučení zahrnují:
- Změna stejných řádků kódu v souboru.
- Odebrání souborů, zatímco změny proběhnou na jiném místě.
Vzhledem k tomu, že k problému dochází lokálně a zbytek členů projektu o něm neví, má řešení konfliktu vysokou prioritu a vyžaduje okamžitou opravu.
Typy konfliktů sloučení Git
Obecné typy konfliktů sloučení závisí na tom, kdy se problém objeví. Ke konfliktům dochází buď:
- Před sloučením , což znamená, že místní změny nejsou aktuální. Chybová zpráva o konfliktu se zobrazí před zahájením sloučení, aby se předešlo problémům.
- Během sloučení , což znamená problém s přepsáním. Zobrazí se chybová zpráva a zastaví proces slučování, aby nedošlo k přepsání změn.
Jak vyřešit konflikty sloučení v Gitu
Existují tři způsoby k vyřešení konfliktu sloučení v Gitu:
1. Přijměte místní verzi . Chcete-li přijmout všechny změny v souboru z místní verze, spusťte:
git checkout --ours <file name>
Případně přijmout místní verzi pro všechny konfliktní soubory, použijte:
git merge --strategy-option ours
2. Přijměte vzdálenou verzi . Chcete-li aktualizovat změny v souboru ze vzdálené větve, spusťte:
git checkout --theirs <file name>
Přijměte vzdálenou verzi pro všechny konfliktní soubory s:
git merge --strategy-option theirs
3. Změny zkontrolujte jednotlivě . Poslední možností je zkontrolovat každou změnu zvlášť. Tato možnost je také nejlepší cestou, zejména při práci s více soubory a lidmi. Aby byla tato úloha lépe zvládnutelná, použijte speciální nástroje, které vám pomohou zkontrolovat jednotlivé konflikty.
Nakonec výběr, které části kódu zůstanou a které ne, závisí na rozhodnutí vývojáře pro aktuální projekt.
Získání konfliktu sloučení v Gitu
Ke konfliktu sloučení v Gitu dojde, když zadáte příkaz git merge
vyvolá chybu.
Chybová zpráva vytiskne informace o tom, kde se konflikt vyskytuje. Zkontrolujte soubor z chybové zprávy a podívejte se na obsah, kde došlo ke konfliktu sloučení:
Git automaticky přidá tři indikátory vedle konfliktních řádků kódu:
- <<<<<<< (sedm znaků „méně než“) následovaných HEAD , což je alias pro aktuální větev. Symboly označují začátek úprav v této sekci.
- ======= (sedm znaků "rovná se"), které ukazují konec revizí v rámci aktuální větve a začátek úprav v rámci nové.
- >>>>>>> (sedm znaků "větší než") následované větví, kde došlo k pokusu o sloučení. Přidané symboly označují konec úprav v konfliktní větvi.
Přidaná syntaxe pomáhá prohledávat kód a najít umístění konfliktu sloučení. Mnohem přímočařejším přístupem je však použití nástroje pro odlišení/sloučení k odhalení problémů a sledování změn.
Nastavení výchozího nástroje rozdílů v Gitu
Chcete-li nastavit výchozí nástroj pro porovnání pro git mergetool
:
1. Spusťte ve svém terminálu následující řádek:
git mergetool --tool-help
Výstup vytiskne všechny podporované nástroje rozdílů pro vaše aktuální nastavení:
V závislosti na zvoleném editoru jsou k dispozici různé nástroje. Například:
- Emacs nástroje diff:Ediff nebo emerge
- Vim nástroje diff:vimdiff, vimdiff2 nebo vimdiff3
Další kroky ukazují příklad, jak nastavit vimdiff nástroj pro Vim.
2. Změňte git config
pro nastavení výchozího nástroje pro sloučení:
git config merge.tool <tool name>
Pokud například používáte Vim, spusťte:
git config merge.tool vimdiff
3. Nastavte nástroj pro porovnání, aby zobrazoval společného předka pro oba soubory, což je verze před úpravami:
git config merge.conflictstyle diff3
4. Nastavte možnost, aby se před spuštěním nezobrazovala výzva:
git config mergetool.prompt false
Nastavení nástroje rozdílů pro Git je dokončeno.
Pomocí nástroje Mergetool zobrazíte rozdíly
Chcete-li použít mergetool
a uvidíte rozdíly, spusťte:
git mergetool
Výstup zobrazí okno se čtyřmi pohledy:
1. MÍSTNÍ představuje verzi souboru z aktuální větve.
2. BÁZE je to, jak soubor vypadal před všemi změnami.
3. VZDÁLENÉ ukazuje, jak soubor vypadá ve vzdálené větvi, kde jsou konfliktní informace.
4. SLOUČENO má konečný slučovací soubor. Tento výsledek představuje to, co se uloží do úložiště.
Primární navigační příkazy mezi těmito okny jsou:
- CTRL+WW pro pohyb mezi okny.
- CTLR+WJ přejdete do zobrazení okna SLOŽENÉ.
- CTRL+WX přepínat místa oken.
Pro pokročilou navigaci jsou informace dostupné pomocí příkazu :help window-moving
.
Aktualizace a řešení konfliktu sloučení
Aktualizujte soubor MERGED, abyste vyřešili konflikt. Některé klávesové zkratky pro aktualizaci MERGED verze zahrnují:
- :diffg LOCAL aktualizuje na LOCAL verzi.
- :diffg BASE aktualizace na BASE verzi.
- :diffg DÁLKOVÉ aktualizace na verzi REMOTE.
Jakmile jsou informace aktualizovány, uložte je a ukončete pomocí :wqa
.
Potvrdit a vyčistit
Posledním krokem je potvrzení a vyčištění dalších souborů. Aktualizovanou verzi potvrďte spuštěním:
git commit -m "<your message>"
Nástroj diff vytváří v projektu další soubory pro porovnání verzí. Vyčistěte je pomocí:
git clean -f
Tipy, jak předejít konfliktům při sloučení
Ke konfliktům sloučení dochází pouze v případě, že počítač není schopen problém vyřešit automaticky.
Zde je několik tipů, jak předejít konfliktům při sloučení:
- Pokud je to možné, použijte nový soubor namísto stávajícího.
- Nepřidávejte změny na konec souboru.
- Stlačte a vytáhněte změny tak často, jak je to možné.
- Nezkrášlujte kód ani neorganizujte importy sami.
- Vyhněte se myšlení sólo programátora tím, že budete mít na paměti ostatní lidi, kteří pracují na stejném kódu.