IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Ukážka zlúčenia vetiev - Git

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:

Repositár pred fast merge - Git

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

Po fast merge - Git
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:

Vetvy pred 3-way merge - Git

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:

Stav vetvá po 3-way merge - Git
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í.


 

Predchádzajúci článok
Git - Správa vetiev
Všetky články v sekcii
Git
Preskočiť článok
(neodporúčame)
Kvíz - Skúmanie histórie, správa a zlučovanie vetiev v Gitu
Článok pre vás napísal Filip Studený
Avatar
Užívateľské hodnotenie:
1 hlasov
.
Aktivity