Ako používať zlúčenie Git


Zhrnutie: Ak chcete zlúčiť vývojovú vetvu do aktuálnej vetvy, použite git merge dev-branch-name. Ak dostanete varovania o konflikte o zlúčení, použite git merge --abort, aby ste z neho vystúpili, alebo upravte ovplyvnené súbory a potom ich potvrďte.

Git používa vetvy na izoláciu vývojových prúdov, aby zabránil znečisteniu vetvy stabilného vydania. Zavedenie práce v odvetví do hlavného prúdu znamená zlúčenie odvetví. Tu je návod, ako to urobiť.

Čo je zlúčenie v Git?

Git bol navrhnutý tak, aby vetvenie bolo jednoduché a rýchle. Na rozdiel od iných systémov na správu verzií je vetvenie na Git triviálna záležitosť. Najmä na projektoch s viacerými vývojármi je vetvenie jedným z hlavných organizačných nástrojov Git.

Pobočky sandboxujú nové snahy o vývoj, takže kód možno upravovať alebo pridávať bez ovplyvnenia kódu v iných vetvách, najmä v hlavnej alebo hlavnej vetve. Toto zvyčajne obsahuje stabilnú verziu vašej kódovej základne.

Izolácia týchto zmien od vašej stabilnej verzie kódu dáva dokonalý zmysel. Ale skôr či neskôr bude nový kód otestovaný, skontrolovaný a vygumovaný, aby mohol byť zavedený do hlavnej vetvy. V tomto bode musíte zlúčiť svoju vetvu do hlavnej vetvy.

V skutočnosti môžu mať pobočky podvetvy, takže môžete zlučovať svoju vetvu do inej vetvy namiesto hlavnej vetvy. Len si pamätajte, že zlúčenie vždy zaberú jednu vetvu a zlúčia ju do cieľovej vetvy, nech už ide o akúkoľvek vetvu. Ak chcete zlúčiť svoju hlavnú vetvu do inej vetvy, môžete to urobiť tiež.

Ako väčšina akcií v systéme Git, vykonávate zlúčenia vo svojom lokálnom úložisku a presúvate ich do vzdialeného úložiska.

Príprava na zlúčenie pobočky v Git

Máme malý vývojový projekt s lokálnym úložiskom Git a vzdialeným úložiskom Git. Vytvorili sme vetvu s názvom „bugfix14“ z vetvy „master“ a pracovali sme na riešení chyby.

Táto práca je dokončená a otestovali sme náš kód. Všetko funguje podľa očakávania. Chceme tieto zmeny zaviesť do hlavnej vetvy, aby naša oprava bola súčasťou ďalšieho vydania softvéru.

Pred vykonaním zlúčenia je potrebné vykonať malú prípravu. Musíme sa uistiť, že cieľová vetva – v tomto prípade „hlavná“ vetva – a vetva, ktorú do nej zlúčime, sú aktuálne.

Na tento účel použijeme príkaz git status.

git status

  • Oprava chyby vo vetve14: Toto je naša aktuálna pobočka.
  • Vaša pobočka má aktuálnu verziu „origin/bugfix“: Pobočka v našom lokálnom úložisku má rovnakú históriu odovzdania ako pobočka vo vzdialenom úložisku. To znamená, že sú totožné.
  • nie je potrebné zaviazať V oblasti prípravy nie sú žiadne zmeny, ktoré by neboli vykonané.
  • vyčistenie pracovného stromu: V pracovnom adresári nie sú žiadne zmeny bez fázy.

Všetky naznačujú, že pobočka je aktuálna a môžeme pokračovať. Ak by niektorý z nich naznačoval, že zmeny existujú, museli by sme ich zinscenovať, potvrdiť a posunúť na diaľkové ovládanie. Ak na týchto súboroch pracoval niekto iný, možno budeme musieť stiahnuť ich zmeny zo vzdialeného úložiska.

Kontrola pobočky, do ktorej sa zlúčime, zjednoduší proces zlučovania. Umožňuje nám tiež overiť, či je aktuálny. Pozrime sa na hlavnú vetvu.

git checkout master
git status

Dostávame rovnaké potvrdenia, že „hlavná“ vetva je aktuálna.

Vykonanie zlúčenia

Pred zlúčením vyzerajú naše odovzdania takto.

Vetva „bugfix14“ bola rozvetvená z vetvy „master“. Po vytvorení vetvy „bugfix14“ došlo k odovzdaniu do „master“ vetvy. Vo vetve „bugfix14“ bolo vykonaných niekoľko záväzkov.

Ubezpečili sme sa, že naše dve pobočky sú aktuálne, a skontrolovali sme „hlavnú“ pobočku. Môžeme vydať príkaz na zlúčenie vetvy „bugfix14“ do vetvy „master“.

git merge bugfix14

Dochádza k zlúčeniu. Vetva „bugfix14“ stále existuje, ale teraz boli zmeny vykonané v tejto vetve zlúčené do vetvy „master“.

V tomto prípade príkaz merge vykoná trojcestné zlúčenie. Existujú iba dve vetvy, ale sú zahrnuté tri commity. Sú to vedúci každej vetvy a tretie potvrdenie, ktoré predstavuje samotnú akciu zlúčenia.

Na aktualizáciu nášho vzdialeného úložiska môžeme použiť príkaz git push.

git push

Niektorí ľudia uprednostňujú odstránenie bočných vetiev, keď ich zlúčili. Iní sa starajú o ich zachovanie ako záznam skutočnej histórie vývoja projektu.

Ak chcete vetvu vymazať, môžete tak urobiť pomocou príkazu git branch s voľbou -d (delete).

git branch -d bugfix14

Ak chcete odstrániť vetvu vo vzdialenom úložisku, použite tento príkaz:

git push origin --delete bugfix14

Budete mať lineárnu históriu odovzdania, ale nebude to skutočná história.

Vykonanie rýchleho zlúčenia vpred v systéme Git

Ak ste sa nezaviazali k „hlavnej“ vetve, vaša história bude vyzerať takto. Bude to vyzerať aj takto, ak ste prepracovali svoju vývojovú vetvu tak, aby bola pripojená ku koncu „hlavnej“ vetvy.

Pretože vo vetve „master“ nie sú žiadne odovzdania, na zlúčenie vetvy „bugfix15“ Git musí iba nasmerovať hlavný ukazovateľ „master“ na posledné odovzdanie vetvy „bugfix15“.

Môžeme použiť zvyčajný príkaz git merge:

git merge bugfix15

To nám dáva tento výsledok.

Čo je to isté ako toto:

Čo je presne to isté ako toto:

Git vykoná rýchle zlúčenie vpred kedykoľvek to bude možné. Ak potvrdenia do „master“ vetvy znamenajú, že rýchle zlúčenie nie je možné, Git použije trojsmerné zlúčenie.

Nemôžete vynútiť zlúčenie vpred – to napokon nemusí byť možné – ale môžete vyhlásiť, že pôjde o zlúčenie vpred alebo nič. Existuje možnosť, ktorá dáva pokyn Gitu, aby použil rýchle zlúčenie vpred, ak je to možné, ale neuskutočnil trojcestné zlúčenie, ak to nie je možné. Možnosť je --ff-only (len rýchle zlúčenie).

Toto zlúči vetvu „bugfix15“ do vetvy „master“, ale iba ak je možné rýchle zlúčenie.

git merge --ff-only bugfix15

Git sa bude sťažovať a skončí, ak to nebude možné.

git merge --ff-only bugfix16

V tomto prípade došlo k odovzdaniu do „hlavnej“ vetvy, takže rýchle zlúčenie nie je možné.

Ako vyriešiť konflikty pri zlučovaní v Git

Ak sa v oboch vetvách zmenili rovnaké časti toho istého súboru, vetvy nie je možné zlúčiť. Na vyriešenie konfliktných úprav je potrebná ľudská interakcia.

Tu sme vykonali zmeny v súbore s názvom „rot.c“ vo vetve s názvom „bugfix17“, ktorú chceme zlúčiť do vetvy „master“. Ale „rot.c“ sa zmenilo aj vo vetve „master“.

git merge bugfix17

Keď sa to pokúsime zlúčiť, dostaneme varovanie, že existujú konflikty. Git uvádza zoznam konfliktných súborov a informuje nás, že zlúčenie zlyhalo. Mohli by sme úplne odstúpiť pomocou možnosti --abort:

git merge --abort

Ale riešenie zlúčení nie je také strašidelné, ako to znie. Git urobil kus práce, aby nám pomohol. Ak upravíme jeden z konfliktných súborov – v našom prípade máme iba jeden –, konfliktné časti kódu sa nám zvýraznia.

Každý konflikt je ohraničený siedmimi znakmi „<<<<<<<“ a siedmimi väčšími ako „>>>>>>>“, pričom sedem znakov rovnosti „=======“ medzi nimi.

  • Kód nad znakmi rovnosti pochádza z vetvy, do ktorej sa zlučujete.
  • Kód pod znakom rovnosti je kód z vetvy, ktorú sa pokúšate zlúčiť.

Pomocou súboru môžete jednoducho vyhľadať jednu zo sád siedmich znakov a prejsť od konfliktu ku konfliktu. Pre každý konflikt si musíte vybrať, ktorú sadu úprav chcete zachovať. Musíte upraviť kód, ktorý odmietate, a sedemznakové riadky, ktoré pridal Git.

Zachováme kód z vetvy „bugfix17“. Po úprave náš súbor vyzerá takto.

Teraz môžeme pokračovať v zlučovaní. Všimnite si však, že na to používame príkaz commit, nie príkaz merge.

Zmenu potvrdíme umiestnením súboru a jeho potvrdením ako zvyčajne. Pred konečným odovzdaním skontrolujeme stav.

git add rot.c
git status
git commit -m "Merged bugfix17"

Zlúčenie je dokončené. Teraz to môžeme poslať do nášho vzdialeného úložiska.

Všetko sa nakoniec spojí

Všetky pobočky je potrebné nakoniec zlúčiť, aby zmeny v nich neosireli a nezabudli na ne.

Zlúčenie pobočiek je jednoduché, ale riešenie konfliktov môže byť v rušných väčších tímoch komplikované. Riešenie konfliktov môže vyžadovať vstup od každého vývojára, aby vysvetlil, čo robí ich kód a prečo vykonal zmeny. Musíte tomu rozumieť skôr, ako sa budete môcť informovane rozhodnúť, ktoré úpravy si ponechať.

Bohužiaľ, Git s tým nemôže pomôcť.