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 eksplicitno 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; premikajo se avtomatsko za vas kadarkoli naredite kakršnokoli omrežno komunikacijo. Veje, ki sledijo daljavam se obnašajo kot zaznamki, da vas spominjajo, kje so bile veje v vaših oddaljenih repozitorijih, ko ste se zadnjič nanje povezali.

Imajo obliko (remote)/(branch). Na primer, če želite videti, kako je veja master na vaši daljavi origin izgledala od zadnjič, ko ste komunicirali z njim, bi preverili vejo origin/master. Če ste delali na težavi s partnerjem in je potisnil na vejo iss53, imate morda vašo lastno lokalno vejo iss53; vendar veja na strežniku bi kazala na pošiljanje pri origin/iss53.

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

Note
“origin” is not special

Tako kot ime veje “master” nima nobenega posebnega pomena v Git-u, niti nima “origin”. Medtem ko je “master” privzeto ime za začetno vejo, ko poženete git init, ki je edini razlog, da je široko uporabljen, “origin” je 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.

Server and local repositories after cloning.
Figure 30. Server and local repositories after cloning

Če naredite nekaj dela na vaši lokalni master veji in vmes nekdo drug potisne na git.ourcompany.com in posodobi njegovo master vejo, potem se bodo vaše zgodovine premaknile naprej različno. Tudi, dokler ostanete izven kontakta z vašim izvornim strežnikom, se vaš origin/master kazalec ne premakne.

Local and remote work can diverge.
Figure 31. Local and remote work can diverge

Da sinhronizirate vaše delo, poženete ukaz git fetch origin. Ta ukaz poišče strežnik, kateri je “origin” (v tem primeru je git.ourcompany.com), ujame kakršnekoli podatke iz njega, ki jih še nimate in posodobi vašo lokalno podatkovno bazo, premakne vaš kazalec origin/master na njegovo novo, bolj posodobljeno pozicijo.

`git fetch` updates your remote references.
Figure 32. git fetch updates your remote references

Za demonstracijo imetja večih oddaljenih strežnikom in kako oddaljene veje za te oddaljene projekte izgledajo, predpostavimo, da imate drug interni strežnik Git, ki je uporabljen samo za razvoj s strani ene vaših šprintnih ekip. 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šo kratko ime za ta celotni URL.

Adding another server as a remote.
Figure 33. Adding another server as a remote

Sedaj lahko poženete git fetch teamone, da ujamete celotni oddaljeni teamone strežnik, ki ga še nimate. Ker ima ta strežnik podmnožico podatkov, ki jih ima vaš strežnik origin sedaj, Git ne ujame nobenih podatkov vendar skupke veje, ki sledi daljavi imenovana teamone/master, ki kaže na pošiljanje, ki ga ima teamone na njegovi veji master.

Remote tracking branch for `teamone/master`.
Figure 34. Remote tracking branch for teamone/master

Porivanje

Ko želite deliti vejo s svetom, jo morate poriniti na daljavo, za katero imate dostop pisanja. Vaše lokalne veje niso avtomatično sinhronizirane z daljavami, na katere pišete - morate eksplicitno potisniti na vejo, ki jo želite deliti. Na ta način lahko uporabite privatne veje za delo, ki ga ne želite deliti in porinete samo na tematske veje, s katerimi želite sodelovanje.

Če imate vejo imenovano serverfix, na kateri želite delati z drugimi, lahko porinete nanjo na enak način, kakor ste porinili na vašo 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 na ref/heads/serverfix:refs/heads/serverfix, kar pomeni, “Vzamimo mojo serverfix lokalno vejo in porinimo nanjo, da se posodobi oddaljeno serverfix branch.” Šli bomo skozi refs/heads/ del v podrobnosti v Notranjost Git-a, vendar v splošnem lahko izpustite. Lahko tudi naredite git push origin serverfix:serverfix, ki naredi isto stvar - pove “Vzamite mojo serverfix in jo naredite oddaljeno serverfix.” To obliko lahko uporabite za porivanje lokalne veje na oddaljeno vejo, ki je poimenovana drugače. Če ne želite, da se imenuje serverfix na daljavi, lahko namesto tega poženete git push origin serverfix:awesomebranch, da porinete vašo lokalno vejo serverfix na vejo awesomebranch na oddaljenem projektu.

Note
Don’t type your password every time

Če uporabljate HTTPS URL za porivanje, vas bo strežnik Git vprašal za uporabniško ime in geslo za overitev. Privzeto vas bo vprašal za te informacije na terminalu, tako da strežnik lahko pove, če vam je dovoljeno porivati.

Če ne želite vpisovati vsakič, ko porivate, lahko nastavite “credential cache”. Najenostavnejše 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 opcij predpomnenja overilnic, ki so na voljo, glejte Credential Storage.

Naslednjič, ko eden izmed vaših sodelavcev ujame iz strežnika, bo dobil referenco, kjer je verzija strežnika 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 ujetje, ki prinese novo vejo, ki sledi daljavi, vam ni treba avtoatično imeti njihove lokalne, urejevalne kopije. 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 vašo trenutno delovno vejo, lahko poženete git merge origin/serverfix. Če želite vašo lastno vejo serverfix, na kateri lahko delate, lahko naredi osnovo iz vaše veje, 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

Izpis lokalne veje iz veje, ki sledi daljavi avtomatično ustvari, kar se imenuj “sledena veja” oz. “tracking branch” (ali nekaj kot je “upstream branch”). Sledene vejeso lokalne veje, ki imajo direktno relacijo z oddaljeno vejo. Če ste na sledeni veji in vpišete git pull, Git avtomatsko ve, iz katerega strežnika ujeti in vejo združiti.

Ko klonirate repozitorij, v splošnem avtomatično ustvari vejo master, ki sled origin/master. Vendar lahko nastavite druge sledene veje, če želite - eno, ki sledi vejam na drugih daljavah ali ne sledi veji master. Enostaven primer je, kar ste ravnokar videli, poženite git checkout -b [branch] [remotename]/[branch]. To je dovolj pogosta operacija, ki jo git ponuja na kratko --track:

$ git checkout --track origin/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 verzijo 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 vaša lokalna veja sf bo avtomatično potegnila iz origin/serverfix.

Če že imate lokalno vejo in želite nastaviti oddaljeno vejo, ki ste jo ravnokar potegnili ali želite spremeniti gorvodno vejo, ki ji slediti, lahko uporabite opcijo -u ali --set-upstream-to k git branch, da jo eksplicitno nastavite kadarkoli.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
Upstream shorthand

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

Če želite videti, katero sledeno vejo imate nastavljeno, lahko uporabite opcijo -vv k 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 naprej, nazaj ali oboje.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

Torej tu lahko vidite, da naša veja iss53 sledi origin/iss533 in je naprej - “ahead” za dva, kar pomeni, da imate dve pošiljanji lokalno, ki nista porinjeni na strežnik. Lahko tudi vidimo, da vaša veja master sledi `origin/master in je posodobljena. Naslednje lahko vidimo, da vaša veja serverfix sledi server-fix-good veji na vašem teamone strežniku in je naprej za tri in nazaj za eno, kar pomeni, da je eno pošiljanje na strežniku, ki ga še nismo združili in tri pošiljanja lokalno, ki jih še nismo potisnili. Na koncu lahko vidimo, da naša veja testing ne sledi katerikoli oddaljeni veji.

Pomembno je opomniti, da te številke so samo od zadnjič, ko ste ujeli iz vsakega strežnika. Ta ukaz ne doseže strežnikov, pove vam o tem, kaj je ujel iz teh strežnikov lokalno. Če želite totalno posodobitev številk naprej ali nazaj, boste morali ujeti iz vseh vaših daljav ravno preden to poženete. To lahko naredite takole $ git fetch --all; git branch --vv

Porivanje

Medtem ko bo ukaz git fetch ujel vse spremembe na strežniku, ki jih še nimate, ne bo nikakor spremenil vašega delovnega direktorija. Enostavno bo dobil podatke za vas 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 zadnji sekciji, ali eksplicitno nastavljeno ali da imate ustvarjeno za vas z ukazoma clone ali checkout, bo git pull poiskal, kateremu strežniku in veji trenutna veja sledi, ujel iz tistega strežnika in nato poskusil združiti v to oddaljeno vejo.

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

Izbris 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). Lahko izbrišete oddaljeno vejo z uporabo opcije --delete na git push. Če želite izbrisati vašo vejo serverfix iz strežnika, poženite sledeče:

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

V osnovi vse kar naredi je, da odstrani kazalec iz strežnika. Git strežnik bo v splošnem obdržal podatke tam za nekaj časa, dokler se poganja zbirka smeti, torej če je bila po nesreči izbrisana, je pogostokrat povrnitev enostavna.