8. diel - Git - Zlučovanie vetiev
V minulej lekcii, Git - Správa vetiev, sme sa zaoberali vetvením.
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 repozitári.
Zase si všetky príkazy budeme skúšať v našom naklonovanom
repozitári Laravel z lekcie Git – Základy –
Dokončenie. Otvoríme terminál MinTTY
a pomocou príkazu
cd laravel
sa do repozitá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 <branch_name>
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 <branch_name>
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 ako 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
:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (3.0) $ git checkout 10.x IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $
Vytvoríme si novú testovaciu cieľovú vetvu, do ktorej budeme zlučovať inú vetvu:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git checkout -b test Switched to a new branch 'test' IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $
Potom vytvoríme budúcu zlučovanú vetvu feature
. Do súboru
README.md
pridáme text Added 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 Added text 2
a
podobne použijeme príkazy git add
a git commit
:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git checkout -b feature IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ echo "Added text 1" >> README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git add README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git commit -m "Edit README.md file" [feature 06db22b6] Edit README.md file 1 file changed, 1 insertion(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ echo "Added text 2" >> README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git add README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git commit -m "Completion of edits to the README.md file." [feature 3e638736] Completion of edits to the README.md file. 1 file changed, 1 insertion(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $
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:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git checkout test IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $ git merge feature Updating 7fe97a16..46736b9c Fast-forward README.md | 2 ++ 1 file changed, 2 insertions(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $
Nasledujúci výpis zmien nam značí kde došlo k zmenám pri zlúčení:
MINGW64:/c/mygit/laravel Updating 7fe97a16..46736b9c Fast-forward README.md | 2 ++ 1 file changed, 2 insertions(+)
Nakoniec vetvu feature
vymažeme:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $ git branch -d feature Deleted branch feature (was 3e638736). IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $
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
Ak sú commity cieľovej vetvy 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
:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (test) $ git checkout 10.x IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git checkout -b feature Switched to a new branch 'feature' IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (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 repozitára:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ echo "Added text 1" >> README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git add README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git commit -m "Edit README.md file" [feature 7eebb0fa] Edit README.md file 1 file changed, 1 insertion(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ echo "Added text 2" >> README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git add README.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git commit -m "Completion of edits to the README.md file." [feature bd2e74b7] Completion of edits to the README.md file. 1 file changed, 1 insertion(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $
Teraz budeme simulovať súčasnú prácu nášho kolegu v cieľovej vetve
10.x
Do súboru CHANGELOG.md
vložíme text
Added text to the file
a zmenu pridáme do staging
area aj lokálneho repozitára:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (feature) $ git checkout 10.x IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ echo "Added text to the file" >> CHANGELOG.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git add CHANGELOG.md IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git commit -m "Edit CHANGELOG.md file" [10.x 91276a86] Edit CHANGELOG.md file 1 file changed, 1 insertion(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $
Teraz vykonáme zlúčenie vetvy feature
do cieľovej vetvy
10.x
:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git merge feature
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 súbor
uložíme a ukončíme editor. Vypíše sa nám nasledujúca správa o
vykonaných zmenách zlúčenia:
MINGW64:/c/mygit/laravel IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $ git merge feature Merge made by the 'ort' strategy. README.md | 2 ++ 1 file changed, 2 insertions(+) IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x) $
Týmto sme úspešne pomocou 3-way merge zlúčili vetvu
feature
do vetvy 10.x
V nasledujúcom kvíze, Kvíz - Skúmanie histórie, správa a zlučovanie vetiev v Gitu, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.