PHPPamokos.lt


9. Atšakos (Branches) ir "git merge" komanda

Atėjo metas įvesti dar vieną naują sąvoką į jūsų pažintį su Git - tai yra atšakos ("branches"). Jų paskirtis yra, iš principo, saugoti kelias repozitorijos versijas vienu metu. Turbūt kyla klausimas - kam to reikia? Tuoj papasakosiu.

Pritaikymas 1 - keli serveriai. Sakykime, kad jūs dirbate pagal profesionalią metodiką ir turite kelias kodo aplinkas: kai padarote pakeitimus, pradžioje juos patestuojate specialiame testavimo ("staging") serveryje, o tik po to keliate į "gyvą" versiją. Tai tokiu atveju yra prasmė tuose serveriuose saugoti skirtingas repozitorijos versijas: sakykime, kad "staging" serveryje būtų išjungtos tam tikros funkcijos (el.laiškų ar SMS siuntimas ir pan.).

Pritaikymas 2 - atskirų funkcijų kūrimas. Tarkime, kad vienu metu jums reikia dirbti prie kelių funkcijų. Viena iš jų ilga ir numatomas koks mėnuo darbo, ir jos tarpinis kodas neturi patekti į GitHub repozitoriją, bet tuo metu reikės kasdien pataisyti kažką smulkaus ar įkelti nedidelių kodo gabaliukų. Tai vėlgi turėtų būti atskira repozitorijos versija tai konkrečiai funkcijai (dažnai vadinama "feature branch"), ir atskira "gyva" nuolat atnaujinama versija, kurios kažkada bus sujungtos į vieną.

Taigi, daugmaž supratote, kam reikia skirtingų repozitorijos versijų - jos ir yra vadinamos branches. Tiesą pasakius, jūs jau esate susidūrėte su atšakomis - ar pamenate, kai kūrėme repozitoriją ir sakiau kad pagrindinė atšaka vadinama master?

Pažvelkime į GitHub vaizdą - puslapyje kur yra mūsų commit sąrašas, galima pasirinkti, kokios atšakos istoriją žiūrime. Kol kas mūsų atveju yra tik viena atšaka master:

Tai sukurkime naują atšaką, kurioje atskirai kursime naują funkciją - sukursime naują failą ir jį modifikuosime. Naujos atšakos kūrimui skirta komanda git branch po kurios parašomas savo sugalvotas atšakos pavadinimas. Pavadinkime savo naują atšaką version2015:
git branch version2015

Kaip matote, jokių rezultatų komanda nepateikia - tiesiog "tyliai" sukuria naują atšaką.

Dabar svarbu suprasti, kas Git sistemoje yra vadinama HEAD - tai yra rodyklė į dabartinę repozitorijos versiją, su kuria yra dirbama. Ir jeigu yra kelios atšakos, tai HEAD yra nukreiptas į tuo metu aktyvią atšaką. Tai mūsų atveju, kol kas mes tik sukūrėme atšaką, bet vis tiek HEAD yra nukreiptas į master atšaką. Tiesa, kol kas atšakos yra identiškos, tai nesudaro jokio skirtumo.

Štai taip - kol kas HEAD rodo į master atšaką. Pakeiskime tai - persijunkime į kitą naujai sukurtą atšaką version2015, tam skirta komanda git checkout, nurodant atšakos pavadinimą:
git checkout version2015

Dabar jau HEAD rodo į atšaką version2015. Ir dabar toje atšakoje atlikime pakeitimus - tarkime, sukurkime failą database.php:

Ir dabar ką mums rodo git status?

Kaip ir galima tikėtis, rodo kad yra vienas naujas failas database.php. Bet atkreipkite dėmesį, kad Git rašo "On branch version2015" vietoje "On branch master". Tai ir yra esminis skirtumas. Dabar padarome commit:

Dabar, kaip matote, naujas commit pakeitimas atsirado tik naujoje atšakoje, ir HEAD rodo būtent į tą paskutinį pakeitimą, ir master atšaka apie naują failą database.php net nieko "nežino". Taigi jeigu dabar persijungsime prie master atšakos su komanda
git checkout master
mūsų kataloge nebeliks failo database.php, tarsi jo ir nebuvo. Jei pereisime vėl prie git checkout version2015 - failas vėl "magiškai" atsiras. Tai, kaip suprantate, persijungus prie konkrečios atšakos, atsinaujina visi failai aktyviame kataloge.


Atšakų sujungimas - git merge

Atkreipkite dėmesį, kad ta version2015 atšaka egzistuoja tik mūsų lokalioje repozitorijoje - mūsų kompiuteryje, ne GitHub. Tikslas toks - padarome norimus pakeitimus, tada įkeliame juos pradžioje į master atšaką, o po to jau tik master atšakos naują versiją įkeliame į GitHub. Tokiu būdu apie mūsų version2015 atšaką niekas ir nesužinos - tai buvo tarsi mūsų lokali kopija tam, kad atskirtume prie kokios funkcijos dirbame.

Taigi sakykime, kad jau padarėme norimus pakeitimus - pats laikas persikelti į master atšaką ir į ją "nukopijuoti" visus pakeitimus. Tai daroma su komanda git merge, nurodant kokios atšakos turinį reikia perkelti į mūsų aktyviąją atšaką:

Kaip matote, failas database.php buvo nukopijuotas į master atšaką, ir dabar galime įkelti jį į GitHub. Atkreipkite dėmesį, kad commit daryti nereikia - jis jau padarytas kitoje atšakoje, taigi užtenka git push:

Ir paskutinis veiksmas - kadangi atšaka version2015 buvo sukurta tik laikinai mūsų atskirai funkcijai sukurti, tai drąsiai galime ją ištrinti - ji nebereikalinga. Trynimas atliekamas su ta pačia komanda git branch, tik pridedant raktą -d ir norimos ištrinti atšakos pavadinimą:
git branch -d version2015



Atšakų įkėlimas į GitHub

Kaip jau minėjau, yra ir kitas atšakų panaudojimo būdas - nutolusioje repozitorijoje iš tikrųjų saugoti kelias atšakas, ir tada skirtingas atšakas surišti su skirtingais serveriais testavimui. Tai tam tikslui reikia sukurti naują atšaką ir įkelti į GitHub. Pavadinkime mūsų naują atšaką testing ir padarykime jos push, viskas atrodo štai taip:

Ir dabar, pažvelgę į GitHub - jau turime dvi atšakas pasirinkimui:

Ir jei kas nors norės parsisiųsti (klonuoti) repozitorijas, bus parsiųstos visos atšakos, ne tik master.

Štai tiek trumpai apie branches ir jų panaudojimą. Atskirai galima būtų daug papasakoti apie jų pritaikymą realių projektų "deployinimui", bet tas procesas labai priklauso nuo konkrečios programavimo kalbos, serverių struktūros ir apskritai projekto - dažniausiai kiekviena kompanija susikuria kažkokį savitą procesą ar jo versiją, tad čia greičiausiai būtų atskiro kurso medžiaga.

O kol kas einame toliau, ir kitoje pamokoje dar artimiau susipažinkime su GitHub ir jos konkurentu Bitbucket.


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com