Git
Chapters ▾ 2nd Edition

3.5 Veje Git - Oddaljene veje

Oddaljene veje

Oddaljene reference so reference (kazalci) v vaših oddaljenih repozitorijih, vključno z vejami, oznakami itd. Polni seznam oddaljenih referenc lahko dobite izrecno z git ls-remote <remote>, ali git remote show <remote> za oddaljene veje kot tudi več informacij. Vseeno, bolj pogosti način je izkoristiti veje, ki sledijo daljavam.

Veje, ki sledijo daljavam, so reference stanja oddaljenih vej. So lokalne reference, ki jih ne morete premakniti; Git jih za vas premakne, kadarkoli naredite kakršnokoli omrežno komunikacijo, da zagotovi, da pravilno predstavljajo stanje oddaljenega repozitorija. Razmišljajte o njih kot o zaznamkih, ki vas opominjajo, kje so bile veje v vaših oddaljenih repozitorijih, ko ste se zadnjič nanje povezali.

Veje s sledenjem daljav imajo obliko <remote>/<branch>. Na primer, če želite videti, kakšna je bila veja master na vaši daljavi origin od zadnjič, ko ste komunicirali z njo, bi preverili vejo origin/master. Če ste delali na težavi s partnerjem in ta potisne na vejo iss53, imate morda vašo lastno lokalno vejo iss53, vendar veja na strežniku bi bila predstavljena kot veja s sledenjem daljave origin/iss53.

To je lahko nekoliko zmedeno, torej poglejmo primer. Recimo, da imate strežnik Git na vašem omrežju na git.ourcompany.com. Če klonirate iz tega, vam jo Gitov ukaz clone avtomatično poimenuje origin, povleče vse njene podatke, ustvari kazalec, kjer se nahaja njegova veja master in jo lokalno poimenuje origin/master. Git vam da tudi vašo lastno lokalno vejo master, ki se začne na istem mestu kot veja izvora (angl. origin) master, tako da imate nekaj za narediti iz tega.

Opomba
»origin« ni nič posebnega

Tako kot ime veje »master« nima v Gitu nobenega posebnega pomena, ga prav tako nima »origin«. Medtem ko je »master« privzeto ime za začetno vejo, ko poženete git init, kar je edini razlog, da je široko uporabljeno, je »origin« privzeto ime za daljavo, ko poženete git clone. Če namesto tega poženete git clone -o booyah, potem boste imeli booyah/master kot vašo privzeto oddaljeno vejo.

Strežniški in lokalni repozitorij po kloniranju
Slika 30. Strežniški in lokalni repozitorij po kloniranju

Če naredite nekaj dela na vaši lokalni veji master in vmes nekdo drug potisne na git.ourcompany.com in posodobi njegovo vejo master, potem se bosta vaši zgodovini premaknili različno naprej. Tudi, dokler ostanete izven povezave z vašim strežnikom origin, se vaš kazalec origin/master ne bo premaknil.

Lokalno in oddaljeno delo se lahko razlikuje
Slika 31. Lokalno in oddaljeno delo se lahko razlikuje

Da sinhronizirate vaše delo z dano daljavo, poženite ukaz git fetch <remote> (v našem primeru, git fetch origin). Ta ukaz poišče strežnik, kjer je »origin« (v tem primeru je git.ourcompany.com), prenese iz njega kakršnekoli podatke, ki jih še nimate, in posodobi vašo lokalno podatkovno bazo, kar premakne vaš kazalec origin/master na njegov novi, bolj posodobljen položaj.

`git fetch` posodobi vaše veje s sledenjem na daljavo
Slika 32. git fetch posodobi vaše veje s sledenjem na daljavo

Za demonstracijo imetja večih oddaljenih strežnikov in kako so oddaljene veje za te oddaljene projekte videti, predpostavimo, da imate drug interni strežnik Git, ki je uporabljen samo za razvoj s strani ene vaših šprintnih ekip (angl. sprint teams). Ta strežnik je na git.team1.ourcompany.com. Lahko ga dodate kot novo oddaljeno referenco k projektu, kjer trenutno delate, s pogonom ukaza git remote add, kot smo pokrili v Osnove Git. Poimenujte to daljavo teamone, ki bo vaše kratko ime za ta celotni URL.

Dodajanje novega strežnika kot daljave
Slika 33. Dodajanje novega strežnika kot daljave

Sedaj lahko poženete git fetch teamone, da prenesete vse, kar ima oddaljeni strežnik teamone in česar vi še nimate. Ker ima ta strežnik podnabor podatkov, ki jih ima sedaj vaš strežnik origin, Git ne prenese nobenih podatkov, vendar postavi vejo s sledenjem daljave imenovano teamone/master, ki kaže na potrditev, ki jo ima teamone na njihovi veji master.

Veja s sledenjem daljave za `teamone/master`
Slika 34. Veja s sledenjem daljave za teamone/master

Potiskanje

Ko želite deliti vejo s svetom, jo morate potisniti na daljavo, na kateri imate dostop pisanja. Vaše lokalne veje niso avtomatično sinhronizirane z daljavami, na katere pišete — eksplicitno morate potisniti veje, ki jih želite deliti. Na ta način lahko uporabite zasebne veje za delo, ki ga ne želite deliti, in potisnete samo tematske veje, na katerih želite sodelovati.

Če imate vejo imenovano serverfix, na kateri želite delati z drugimi, jo lahko potisnete na enak način, kakor ste potisnili svojo prvo vejo. Poženite git push <remote> <branch>:

$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
 * [new branch]      serverfix -> serverfix

To je nekakšna bližnjica. Git avtomatično razširi ime veje serverfix v refs/heads/serverfix:refs/heads/serverfix, kar pomeni, »Vzemi mojo lokalno vejo serverfix in jo potisni, da se posodobi oddaljena veja serverfix«. Podrobneje bomo šli skozi del refs/heads/ v poglavju Notranjost Gita, vendar v splošnem lahko to izpustite. Lahko naredite tudi git push origin serverfix:serverfix, kar naredi isto stvar — pravi »Vzemi mojo vejo serverfix in jo naredi oddaljeno vejo serverfix«. To obliko lahko uporabite za potiskanje lokalne veje na oddaljeno vejo, ki je poimenovana drugače. Če ne želite, da se na daljavi imenuje serverfix, lahko namesto tega poženete git push origin serverfix:awesomebranch, da potisnete vašo lokalno vejo serverfix na vejo awesomebranch na oddaljenem projektu.

Opomba
Ne vpisujte vsakič svojega gesla

Če za potiskanje uporabljate HTTPS URL, vas bo strežnik Git vprašal za uporabniško ime in geslo za overjanje. Privzeto vas bo vprašal za te informacije v terminalu, tako da strežnik lahko ve, ali vam je potiskanje dovoljeno.

Če ne želite vsakič vpisovati, ko potiskate, lahko nastavite »predpomnilnik poverilnic« (angl. credential cache). Najenostavnejše ga je samo obdržati v spominu za nekaj minut, kar lahko enostavno nastavite s pogonom git config --global credential.helper cache.

Za več informacij o različnih možnostih predpomnjenja poverilnic, ki so na voljo, glejte razdelek Shramba poverilnic.

Naslednjič, ko eden izmed vaših sodelavcev prenese iz strežnika, bo dobil referenco, kjer je strežniška različica serverfix pod oddaljeno vejo origin/serverfix:

$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix

Pomembno je opomniti, da ko naredite prenos, ki prinese novo vejo, ki sledi daljavi, vam ni treba avtomatično imeti njihovih lokalnih, urejevalnih kopij. Z drugimi besedami v tem primeru, nimate nove veje serverfix — imate samo kazalec origin/serverfix, ki ga ne morete spremeniti.

Da združite to delo v svojo trenutno delovno vejo, lahko poženete git merge origin/serverfix. Če želite vašo lastno vejo serverfix, na kateri lahko delate, jo lahko osnujete na svoji veji, ki sledi daljavi:

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

To vam da lokalno vejo, na kateri lahko delate, in se začne, kjer je origin/serverfix.

Sledenje vej

Izvlečenje lokalne veje iz veje, ki sledi daljavi, avtomatično ustvari t. i. »sledeno vejo« (angl.tracking branch) in veja, ki ji sledi, se imenuje zgornja veja oz. veja povratnega toka (angl. upstream branch). Sledene veje so lokalne veje, ki imajo neposreden odnos z oddaljeno vejo. Če ste na sledeni veji in vpišete git pull, Git avtomatsko ve, iz katerega strežnika prenesti in katero vejo združiti.

Ko klonirate repozitorij, v splošnem avtomatično ustvari vejo master, ki sledi origin/master. Vendar nastavite lahko tudi druge sledene veje, če želite — take, ki sledijo vejam na drugih daljavah ali ne sledijo veji master. Enostaven primer je, kar ste ravnokar videli, da poženete git checkout -b <branch> <remote>/<branch>. To je dovolj pogosta operacija, zato ima Git na voljo bližnjico --track:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

V bistvu je to tako pogosto, da je na voljo celo bližnjica za to bližnjico. Če ime veje, ki jo želite izvleči, (a) ne obstaja in (b) se točno prilega imenu na samo eni izmed daljav, bo Git ustvaril sledeno vejo namesto vas:

$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Da nastavite lokalno vejo z različnim imenom, kot je oddaljena veja, lahko enostavno uporabite prvo različico z različnim imenom lokalne veje:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'

Sedaj bo vaša lokalna veja sf avtomatično vlekla iz origin/serverfix.

Če že imate lokalno vejo in jo želite nastaviti na oddaljeno vejo, ki ste jo ravnokar povlekli, ali pa želite spremeniti vejo povratnega toka, ki ga sledite, lahko pri ukazu git branch uporabite možnost -u ali --set-upstream-to, da jo izrecno nastavite kadarkoli.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Opomba
Bližnjica povratnega toka

Ko imate sledeno vejo nastavljeno, lahko naredite referenco na vejo povratnega toka z bližnjico @{upstream} ali @{u}. Torej če ste na veji master in ta sledi origin/master, lahko, če želite, naredite nekaj kot git merge @{u} namesto git merge origin/master.

Če želite videti, katero sledeno vejo imate nastavljeno, lahko uporabite možnost -vv ukaza git branch. To bo izpisalo vaše lokalne veje z več informacijami vključno, čemu vsaka veja sledi in če je vaša lokalna veja spredaj, zadaj, ali oboje.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
  master    1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do it
  testing   5ea463a Try something new

Torej tu lahko vidite, da naša veja iss53 sledi origin/iss533 in je »spredaj« (angl. ahead) za dva, kar pomeni, da imamo lokalno dve potrditvi, ki nista potisnjeni na strežnik. Lahko vidimo tudi, da naša veja master sledi origin/master in je posodobljena. Naslednje lahko vidimo, da naša veja serverfix sledi veji server-fix-good na našem strežniku teamone in je spredaj za tri in zadaj za eno, kar pomeni, da je na strežniku ena potrditev, ki je še nismo združili in lokalno tri potrditve, ki jih še nismo potisnili. Na koncu lahko vidimo, da naša veja testing ne sledi katerikoli oddaljeni veji.

Pomembno je opomniti, da so te številke samo od zadnjič, ko ste prenesli iz vsakega strežnika. Ta ukaz ne seže po strežnikih, pove vam o tem, kaj je lokalno shranil v predpomnilnik iz teh strežnikov. Če želite popolno posodobitev številk spredaj ali zadaj, boste morali prenesti iz vseh svojih daljav, ravno preden to poženete. To lahko naredite takole:

$ git fetch --all; git branch -vv

Vlečenje

Medtem ko bo ukaz git fetch na strežnik prenesel vse spremembe, ki jih še nimate, ne bo nikakor spremenil vašega delovnega direktorija. Enostavno vam bo pridobil podatke in vam omogočil, da jih združite sami. Vendar pa obstaja ukaz imenovan git pull, ki je v bistvu git fetch, ki mu takoj sledi git merge v večini primerov. Če imate nastavljeno sledeno vejo, kot je demonstrirano v zadnjem razdelku, bodisi izrecno nastavljeno, ali pa da vam jo je ustvarilo z ukazoma clone ali checkout, bo git pull poiskal, kateremu strežniku in veji trenutna veja sledi, prenesel iz tistega strežnika in nato to oddaljeno vejo poskusil združiti.

V splošnem je bolje, da enostavno uporabite ukaza fetch in merge izrecno, saj je čarobnost git pull pogostokrat zmedena.

Brisanje oddaljenih vej

Predpostavimo, da ste končali z oddaljeno vejo — recimo, da ste vi in vaši sodelavci končali z lastnostjo in jo imate združeno v vašo oddaljeno vejo master (ali katerokoli vejo, na kateri je vaša stabilna linija kode). Oddaljeno vejo lahko izbrišete z uporabo možnosti --delete pri git push. Če želite izbrisati vašo vejo serverfix iz strežnika, poženite naslednje:

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

V osnovi vse kar to naredi, je, da odstrani kazalec iz strežnika. Strežnik Git bo v splošnem obdržal podatke tam za nekaj časa, dokler se ne požene sproščanje pomnilnika (angl. garbage collection), torej če je bila po nesreči izbrisana, je povrnitev pogostokrat enostavna.

scroll-to-top