8. diel - Git - Zlučovanie vetiev Nové
V Git tutoriáli sa budeme zaoberať zlučovaním vetiev. Preberieme si typy zlúčenia Fast-forward merge a 3-way merge, ktoré si vyskúšame na našom repositári.
Zase si všetky príkazy budeme skúšať v našom naklonovanom
repositári Laravel z lekcie Git – Základy –
Dokončenie. Otvoríme príkazový riadok a pomocou príkazu
cd laravel
sa do repositára presunieme.
Zlučovanie vetiev
Pre zlučovanie vetiev máme v Gite príkaz git merge
, ktorý
slúži na integráciu zmien z jednej vetvy do inej, čím sa spojí história
oboch vetiev. Tento proces je nevyhnutný najmä pri spolupráci v tíme, keď
rôzni členovia pracujú na rôznych vetvách projektu a neskôr sa musí ich
práca zlúčiť do hlavného kódu.
Pri použití príkazu git merge <název_větve>
sa obsah
a zmeny zo zlučovanej vetvy začlenia do cieľovej vetvy. Git sa snaží
vykonať zlúčenie automaticky, ak nedochádza ku konfliktom v
kóde. Ak však nastanú konflikty, Git upozorní používateľa a
umožní im ich ručne vyriešiť.
Konflikty vo vetvách sa budeme zaoberať ďalej v kurze.
Po vykonaní zlúčenia sa vykonané zmeny zo zlučovanej vetvy objavia v
cieľovej vetve ako nové commity, ktoré zaznamenajú históriu zlúčenia. Na
nasledujúcom obrázku vidíme, ako sa zmení cieľová vetva main
po zlúčení s vetvou feature
:

Pred zlúčením vetiev je potrebné potvrdiť prijímajúcu vetvu a načítať najnovšie vzdialené commity.
Potvrdenie prijímajúcej vetvy
Pred zlúčením dvoch vetiev je dôležité zistiť, či sa nachádzame na
správnej vetve, do ktorej bude zlúčenie vykonané. Príkazom
git status
zistíme, či HEAD
ukazuje na správnu
vetvu prijímajúcu zlúčenie. Pokiaľ sa nachádzame na zlej vetve, použijeme
príkaz git checkout <název větve>
pre zmenu vetvy.
Načítanie najnovších vzdialených commitov
Ďalej sa musíme uistiť, že cieľová a zlučovacia vetva obsahujú
najnovšie commity. Pre aktualizáciu vetiev spustíme príkaz
git fetch
, čím si stiahneme najnovšie vzdialené commity. Po
dokončení načítania sa príkazom git pull
uistíme, že
cieľová vetva má najnovšie aktualizácie.
Typy zlúčenia
V Gite existujú 2 základné typy zlúčenia, ktoré sa používajú na integráciu zmien z jednej vetvy do druhej. Jedná sa o fast-forward merge a 3-way merge.
Fast-forward merge
Pokiaľ commity cieľovej vetvy nie sú novšie, než commity vetvy zlučované, potom použijeme práve fast-forward merge zlúčenie. História cieľovej vetvy sa jednoducho posunie dopredu na posledný commit zo zlučovanej vetvy. To znamená, že sa zmeny vykonané v zlučovanej vetve pridajú priamo na koniec cieľovej vetvy.
Fast-forward merge zlúčenie môžeme použiť v prípade neexistencie zmien v cieľovej vetve od doby, keď sme sa od nej odštiepili do zlučovanej vetvy.
Na obrázku vidíme stav vetve main
a feature
pred
zlúčením:

Po Fast-forward merge budú vetvy vyzerať nasledovne:

Príklad
Na nasledujúcom príklade si ukážeme zlúčenie dvoch vetiev pomocou
fast-forward merge zlúčenia. Najskôr sa prepneme späť do
vetvy 10.x
:
Vytvoríme si novú testovaciu cieľovú vetvu, do ktorej budeme zlučovať inú vetvu:
Potom vytvoríme budúcu
zlučovanú vetvu feature
. Do súboru README.md
pridáme text Přidaný text 1
. Zmeny v súbore
README.md
pridáme do staging area a commitneme. Potom do súboru
README.md
pridáme ďalší nový text
Přidaný text 2
a podobne použijeme príkazy git add
a git commit
:
Pracovné priestory vrátane staging area sme preberali v lekcii Git-História a princípy.
Teraz vykonáme zlúčenie vetvy feature
do cieľovej vetvy
test
pomocou fast-forward merge zlúčenie:
Zobrazí sa nám tento výpis vykonaných zmien:
Nakoniec vetvu
feature
vymažeme:
Týmto sme úspešne vykonali zlúčenie dvoch vetiev do jednej pomocou zlúčenia typu Fast-forward merge. Toto zlúčenie však nie je možné, ak sa vetvy rozchádzajú. Pokiaľ k cieľovej vetve neexistuje lineárna cesta, Git nemá inú možnosť ako ich skombinovať pomocou 3-way merge zlúčenia.
3-way merge
Pokiaľ commity cieľovej vetvy sú novšie ako commity vetvy zlučované, potom použijeme 3-way merge zlúčenie. Toto zlúčenie využijeme, keď sa obe vetvy od okamihu rozvetvenia rozvíjali:

Počas tohto procesu Git automaticky detekuje, ktoré časti kódu boli upravené na oboch vetvách od posledného spoločného commitu a snažia sa ich zlúčiť do jedného nového commitu. Ak sa v súboroch nachádzajú konflikty, Git označí tieto miesta a používatelia musia ručne tieto konflikty vyriešiť. Tento proces je trochu zložitejší ako fast-forward merge, pretože vyžaduje manuálne zásahy a kontrolu konfliktov.
Po 3-way merge zlúčení budú vetvy vyzerať nasledovne:

Príklad
Na nasledujúcom príklade si ukážeme proces zlúčenia dvoch vetiev
pomocou 3-way merge zlúčenia. Máme cieľovú vetvu
10.x
, od ktorej sa odštiepime do budúcej zlučovanej vetvy
feature
. V tejto vetve potom pracujeme. Medzitým však náš
kolega vytvára zmeny v cieľovej vetve 10.x
Tento scenár sa často vyskytuje pri implementácii rozsiahlych funkcií alebo pri súčasnej práci niekoľkých vývojárov na rovnakom projekte.
Začneme presunom do cieľovej vetvy 10.x
a vytvorením novej
budúcej zlučovanej vetvy feature
:
Teraz pracujeme v našej
vetve feature
. Do súboru README.md
podobne pridáme
nové texty a každú zmenu pridáme do staging area aj
lokálneho repositára:
Teraz budeme simulovať
súčasnú prácu nášho kolegu v cieľovej vetve 10.x
Do súboru
CHANGELOG.md
vložíme text Přidaný text do souboru
a zmenu pridáme do staging area aj lokálneho
repositára:
Teraz vykonáme zlúčenie
vetvy feature
do cieľovej vetvy 10.x
:
Otvorí sa nám zlučovací
súbor. Do neho by sme mohli pridať odôvodnenie zlúčenia vetiev. My tento
súbor len zatvoríme stlačením klávesy Esc. Potom napíšeme
príkaz :wq
, čím uložíme súbor a ukončíme editor. Vypíše
sa nám nasledujúca správa o vykonaných zmenách zlúčenia:
Týmto sme úspešne pomocou
3-way merge zlúčili vetvu feature
do vetvy
10.x
V budúcej lekcii, Git - Kolízia medzi konármi , sa budeme zaoberať kolíziami pri zlučovaní vetiev. Vysvetlíme si, kedy kolízie vznikajú a ako ich najlepšie riešiť.