12. diel - Git - Kolízia medzi konármi
V predchádzajúcom kvíze, Kvíz - Skúmanie histórie, správa a zlučovanie vetiev v Gitu, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
V dnešnom Git tutoriále sa budeme zaoberať kolíziami pri zlučovaní vetiev. Vysvetlíme si, kedy kolízie vznikajú. Na praktických príkladoch sa naučíme, ako rôzne typy kolízií najlepšie vyriešiť.
Všetky príkazy budeme vykonávať 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.
Kolízie medzi konármi
Kolízie vznikajú pri zlučovaní dvoch vetiev. Kolízia nastane, keď sa dve vetvy pokúša upraviť rovnakú časť kódu alebo súbor súčasne a Git nedokáže rozhodnúť, ktorú verziu použiť.
Kolízie môžu vzniknúť z nasledujúcich dôvodov:
- úpravy rovnakého riadku kódu,
- zmazanie alebo premenovanie súborov,
- zmeny v rôznych častiach rovnakého súboru.
unmerged paths
. V takom prípade je na vývojári vyriešiť
konflikt a určiť, ktoré zmeny majú byť zachované.
Riešenie kolízií je dôležitou súčasťou správy verzií v Gitu a
nevyhnutné pre koordináciu vývoja projektu v tíme.
Keď narazíme na kolíziu pri zlučovaní, spustením príkazu
git status
by sme si zobrazili výpis súborov, ktoré ho
spôsobili. Napríklad, ak by obe naše vetvy upravili rovnakú časť súboru
README.md
, zobrazila by sa táto varovná správa:
Typy kolízií
Konflikty môžu nastať v dvoch prípadoch: Na začiatku procesu zlúčenia alebo počas neho.
Zlyhanie zlúčenia pri spustení
Tento typ kolízie nastáva v prípade, keď prebiehajúce zmeny v pracovnom
adresári, alebo v pracovnej oblasti projektu, by boli prepísané commity,
ktoré sa práve zlučujú. Tento problém vzniká kvôli existujúcim lokálnym
zmenám. Na odstránenie tejto situácie a prevzatie kontroly nad miestnym
stavom slúžia príkazy git checkout
, git commit
a
git reset
.
Pri zlyhaní zlúčenia pri spustení sa zobrazí nasledujúca správa:
Zlyhanie počas zlučovania
Kolízia typu zlyhania počas zlučovania hovorí, že došlo ku konfliktu medzi aktuálnou cieľovou vetvou a zlučovanou vetvou. Pri tomto type kolízie sa zobrazí nasledujúca správa:
Identifikácia konfliktov pri zlučovaní vetiev
Na nasledujúcom príklade si ukážeme, ako taká kolízia môže vzniknúť. Naučíme sa namiesto kolízie identifikovať a opraviť.
Príklad
Začneme tým, že sa prepneme do vetvy feature
príkazom:
Vetva feature
sme zakladali v lekcii Git - Zlučovanie
vetiev. Pokiaľ ju nemáte, založte si ju príkazom
git checkout -b feature
.
Teraz vykonáme editáciu súboru README.md
a vytvoríme
commit:
Nasledovne sa prepneme na
vetvu 10.x
, vykonáme editáciu súboru README.md
a
vytvoríme commit:
V poslednom kroku zlúčime
vetvy feature
s vetvou 10.x
:
Hlásenie o kolízii
Po spustení príkazu git merge
nastane kolízia a vypíše sa
nám nasledujúca správa:
Správa nám označuje, že
došlo ku kolízii v súbore README.md
a automatické zlúčenie
zlyhalo. Teraz sa pozrieme na nezlúčené vetvy. Spustite príkaz
git status
, aby sme získali nasledujúci výpis o stave
repositára:
Výpis nám hovorí:
On branch 10.x
: Nachádzame sa na vetve10.x
Your branch is ahead of 'origin/10.x' by 5 commits.
: Lokálna vetva má o 5 commitov viac, než vzdialená vetvaorigin/10.x
.You have unmerged paths.
: Existujú súbory, ktoré nemožno automaticky zlúčiť. Je potrebné ručne vyriešiť konflikty v týchto súboroch.Unmerged paths:
: Existujú súbory so zmenami, ktoré je potrebné ručne zlúčiť.both modified: README.md
: SúborREADME.md
bol upravený oboma vetvami a spôsobil kolíziu.
README.md
spôsobil kolíziu. Keďže
cieľová a zlučovaná vetva obsahuje zmeny, Git nevie akú verziu súboru
použiť, a preto vyvolal kolíziu.
Nájdenie miesta kolízie
Miesto, kde došlo ku kolízii si popíšeme. Otvoríme súbor
README.md
príkazom cat
alebo type
:
Miesto, kde došlo ku kolízii pri zlúčení je označené týmito vizuálnymi znakmi:
Značky =======
označujú stred kolízie. Obsah medzi týmito značkami a riadkom
HEAD
predstavuje obsah existujúci v aktuálnej cieľovej vetve, na
ktorý odkazuje ukazovateľ HEAD
.
Riešenie kolízie
Pokiaľ sa stretneme s kolíziou, je dôležité ju správne vyriešiť. Najbežnejším postupom je upraviť súbor, v ktorom došlo ku kolízii a určiť, ktoré zmeny majú byť zachované.
V našom prípade sa bude jednať o súbor README.md
. Otvoríme
ho v editore a nájdeme nasledujúce konfliktné značky:
Pre vyriešenie kolízie je
nutné odstrániť konfliktné značky a upraviť obsah tak, aby zodpovedal
požadovanému výsledku zlúčenia. Súbor README.md
upravíme
tak, aby boli prítomné úpravy z oboch vetiev. Koniec súboru
README.md
bude vyzerať nasledovne:
Upravený súbor uložíme a vykonáme commit pre uloženie vykonaných zmien:
Po vytvorení commitu je kolízia úspešne vyriešená a zmeny sú zaznamenané v repositári. Zlúčenie vetiev sa automaticky dokončí po vytvorení commitu.
V nasledujúcom kvíze, Kvíz - Git, si vyskúšame nadobudnuté skúsenosti z kurzu.