Lekce 8 - Git - Slučování větví Nové
V minulé lekci, Git - Správa větví, jsme se zabývali větvením.
V Git tutoriálu se budeme zabývat slučováním větví. Probereme si typy sloučení fast-forward merge a 3-way merge, které si vyzkoušíme na našem repozitáři.
Zase si všechny příkazy budeme zkoušet v našem
naklonovaném repozitáři Laravel z lekce Git - Základy -
Dokončení. Otevřeme příkazovou řádku a pomocí příkazu
cd laravel
se do repozitáře přesuneme.
Slučování větví
Pro slučování větví máme v Gitu příkaz git merge
, který
slouží k integraci změn z jedné větve do jiné, čímž se spojí historie
obou větví. Tento proces je nezbytný zejména při spolupráci v týmu, kdy
různí členové pracují na různých větvích projektu a později se musí
jejich práce sloučit do hlavního kódu.
Při použití příkazu git merge <název_větve>
se
obsah a změny ze slučované větve začlení do cílové větve. Git se
snaží provést sloučení automaticky, pokud nedochází ke
konfliktům v kódu. Pokud však nastanou konflikty, Git
upozorní uživatele a umožní jim je ručně vyřešit.
Konflikty ve větvích se budeme zabývat dále v kurzu.
Po provedení sloučení se provedené změny ze slučované větve objeví v
cílově větvi jako nové commity, které zaznamenají historii sloučení. Na
následujícím obrázku vidíme, jak se změní cílová větev
main
po sloučení s větví feature
:

Před sloučením větví je třeba potvrdit přijímající větev a načíst nejnovější vzdálené commity.
Potvrzení přijímající větve
Před sloučením dvou větví je důležité zjistit, zda se nacházíme na
správné větvi, do které bude sloučení provedeno. Příkazem
git status
zjistíme, zda HEAD
ukazuje na správnou
větev přijímající sloučení. Pokud se nacházíme na špatné větvi,
použijeme příkaz git checkout <název větve>
pro změnu
větve.
Načtení nejnovějších vzdálených commitů
Dále se musíme ujistit, že cílová a slučovací větev obsahují
nejnovější commity. Pro aktualizaci větví spustíme příkaz
git fetch
, čímž si stáhneme nejnovější vzdálené commity.
Po dokončení načítání se příkazem git pull
ujistíme, že
cílová větev má nejnovější aktualizace.
Typy sloučení
V Gitu existují 2 základní typy sloučení, které se používají k integraci změn z jedné větve do druhé. Jedná se o fast-forward merge a 3-way merge.
Fast-forward merge
Pokud commity cílové větve nejsou novější než commity větve slučované, pak použijeme právě fast-forward merge sloučení. Historie cílové větve se jednoduše posune dopředu na poslední commit ze slučované větve. To znamená, že se změny provedené ve slučované větvi přidají přímo na konec cílové větve.
Fast-forward merge sloučení můžeme použít v případě neexistence změn v cílové větvi od doby, kdy jsme se od ní odštěpili do slučované větve.
Na obrázku vidíme stav větvě main
a feature
před sloučením:

Po fast-forward merge budou větve vypadat následovně:

Příklad
Na následujícím příkladu si ukážeme sloučení dvou větví pomocí
fast-forward merge sloučení. Nejdříve se přepneme zpět do
větve 10.x
:
git checkout 10.x
Vytvoříme si novou testovací cílovou větev, do které budeme slučovat jinou větev:
git checkout -b test
Poté vytvoříme budoucí slučovanou větev feature
. Do
souboru README.md
přidáme text Přidaný text 1
.
Změny v souboru README.md
přidáme do staging area a commitneme.
Pak do souboru README.md
přidáme další nový text
Přidaný text 2
a podobně použijeme příkazy
git add
a git commit
:
git checkout -b feature echo "Přidaný text 1" >> README.md git add README.md git commit -m "Edit souboru README.md" echo "Přidaný text 2" >> README.md git add README.md git commit -m "Dokončení úprav souboru README.md"
Pracovní prostory včetně staging area jsme probírali v lekci Git - Historie a principy.
Nyní provedeme sloučení větve feature
do cílové větve
test
pomocí fast-forward merge sloučení:
git checkout test git merge feature
Zobrazí se nám tento výpis provedených změn:
Updating 7fe97a16..46736b9c Fast-forward README.md | 2 ++ 1 file changed, 2 insertions(+)
Nakonec větev feature
vymažeme:
git branch -d feature
Tímto jsme úspěšně provedli sloučení dvou větví do jedné pomocí sloučení typu fast-forward merge. Toto sloučení však není možné, pokud se větve rozcházejí. Pokud k cílové větvi neexistuje lineární cesta, Git nemá jinou možnost než je zkombinovat pomocí 3-way merge sloučení.
3-way merge
Pokud jsou commity cílové větve novější než commity větve slučované, pak použijeme 3-way merge sloučení. Toto sloučení využijeme, když se obě větve od okamžiku rozvětvení rozvíjely:

Během tohoto procesu Git automaticky detekuje, které části kódu byly upraveny na obou větvích od posledního společného commitu, a snaží se je sloučit do jednoho nového commitu. Pokud se v souborech nachází konflikty, Git označí tato místa a uživatelé musí ručně tyto konflikty vyřešit. Tento proces je trochu složitější než fast-forward merge, protože vyžaduje manuální zásahy a kontrolu konfliktů.
Po 3-way merge sloučení budou větve vypadat následovně:

Příklad
Na následujícím příkladu si ukážeme proces sloučení dvou větví
pomocí 3-way merge sloučení. Máme cílovou větev
10.x
, od které se odštěpíme do budoucí slučované větve
feature
. V této větvi pak pracujeme. Mezitím však náš kolega
vytváří změny v cílové větvi 10.x
.
Tento scénář se často vyskytuje při implementaci rozsáhlých funkcí nebo při současné práci několika vývojářů na stejném projektu.
Začneme přesunem do cílové větve 10.x
a vytvořením nové
budoucí slučované větve feature
:
git checkout 10.x git checkout -b feature
Nyní pracujeme v naší větvi feature
. Do souboru
README.md
podobně přidáme nové texty a každou změnu přidáme
do staging area i lokálního
repozitáře:
echo "Přidaný text 1" >> README.md git add README.md git commit -m "Úprava souboru README.md" echo "Přidaný text 2" >> README.md git add README.md git commit -m "Dokončení úprav souboru README.md"
Nyní budeme simulovat současnou práci našeho kolegy v cílové větvi
10.x
. Do souboru CHANGELOG.md
vložíme text
Přidaný text do souboru
a změnu přidáme do staging
area i lokálního repozitáře:
git checkout 10.x echo "Přidaný text do souboru" >> CHANGELOG.md git add CHANGELOG.md git commit -m "Editace souboru CHANGELOG.md"
Nyní provedeme sloučení větve feature
do cílové větve
10.x
:
git merge feature
Otevře se nám slučovací soubor. Do něj bychom mohli přidat
odůvodnění sloučení větví. My tento soubor jen zavřeme stiskem klávesy
Esc. Poté napíšeme příkaz :wq
, čímž soubor
uložíme a ukončíme editor. Vypíše se nám následující zpráva o
provedených změnách sloučení:
Merge made by the 'ort' strategy. README.md | 2 ++ 1 file changed, 2 insertions(+)
Tímto jsme úspěšně pomocí 3-way merge sloučili větev
feature
do větve 10.x
.
V příští lekci, Git - Kolize mezi větvemi, se budeme zabývat kolizemi při slučování větví. Vysvětlíme si, kdy kolize vznikají a jak je nejlépe řešit.