Chapters ▾ 2nd Edition

3.5 Git Branching - Afgeleë Takke (Remote Branches)

Afgeleë Takke (Remote Branches)

Afgeleë verwysings (remote references) is verwysings (wysers/pointers) in jou afgeleë bewaarplekke (remote repositories), insluitend takke, merkers (tags), ensovoorts. Jy kan 'n volledige lys van afgeleë verwysings eksplisiet kry met git ls-remote <remote>, of git remote show <remote> vir afgeleë takke asook vir meer inligting. Nietemin is 'n meer algemene manier om voordeel te trek uit afgeleë-naspeur takke (remote-tracking branches).

Remote-tracking takke is verwysings na die toestand van afgeleë takke (remote branches). Dit is plaaslike (local) verwysings wat jy nie kan skuif nie; Git skuif hulle outomaties vir jou wanneer jy enige netwerkkommunikasie doen, om seker te maak hulle verteenwoordig die toestand van die afgeleë bewaarplek akkuraat. Dink aan hulle as boekmerke, om jou te herinner waar die takke in jou afgeleë bewaarplekke was die laaste keer toe jy met hulle gekonnekteer het.

Remote-tracking takname neem die vorm <remote>/<branch> aan. Byvoorbeeld, as jy wil sien hoe die master tak op jou origin remote gelyk het die laaste keer toe jy daarmee gekommunikeer het, sal jy die origin/master tak nagaan. As jy saam met 'n vennoot aan 'n kwessie gewerk het en hulle het 'n iss53 tak opgestuur (pushed), het jy dalk jou eie plaaslike iss53 tak, maar die tak op die bediener sal verteenwoordig word deur die remote-tracking tak origin/iss53.

Dit mag dalk 'n bietjie verwarrend wees, so kom ons kyk na 'n voorbeeld. Kom ons sê jy het 'n Git-bediener op jou netwerk by git.ourcompany.com. As jy hiervan af kloon, noem Git se clone opdrag dit outomaties origin vir jou, trek al die data daarvan af (pulls down), skep 'n wyser na waar sy master tak is, en noem dit plaaslik origin/master. Git gee jou ook jou eie plaaslike master tak wat op dieselfde plek as origin se master tak begin, sodat jy iets het om van af te werk.

Note
“origin” is nie spesiaal nie

Net soos die taknaam “master” geen spesiale betekenis in Git het nie, het “origin” ook nie. Terwyl “master” die versteknaam (default name) is vir 'n begin-tak wanneer jy git init uitvoer, wat die enigste rede is hoekom dit wyd gebruik word, is “origin” die versteknaam vir 'n remote wanneer jy git clone uitvoer. As jy eerder git clone -o booyah uitvoer, sal jy booyah/master as jou verstek afgeleë tak (default remote branch) hê.

Server and local repositories after cloning
Figure 30. Bediener en plaaslike bewaarplekke na kloning

As jy bietjie werk op jou plaaslike master tak doen, en in die tussentyd stuur (push) iemand anders na git.ourcompany.com en dateer hul master tak op, dan beweeg julle geskiedenisse verskillend vorentoe. Boonop, solank jy uit kontak met jou origin bediener bly, skuif jou origin/master wyser nie.

Local and remote work can diverge
Figure 31. Plaaslike en afgeleë werk kan afwyk (diverge)

Om jou werk met 'n gegewe remote te sinchroniseer, voer jy 'n git fetch <remote> opdrag uit (in ons geval, git fetch origin). Hierdie opdrag kyk watter bediener “origin” is (in hierdie geval is dit git.ourcompany.com), haal (fetch) enige data daarvan af wat jy nog nie het nie, en dateer jou plaaslike databasis op, wat jou origin/master wyser na sy nuwe, meer onlangse posisie skuif.

`git fetch` updates your remote-tracking branches
Figure 32. git fetch dateer jou remote-tracking takke op

Om te demonstreer hoe om veelvuldige afgeleë bedieners (remote servers) te hê en hoe afgeleë takke vir daardie afgeleë projekte lyk, kom ons aanvaar jy het nog 'n interne Git-bediener wat slegs vir ontwikkeling deur een van jou naellope-spanne (sprint teams) gebruik word. Hierdie bediener is by git.team1.ourcompany.com. Jy kan dit as 'n nuwe afgeleë verwysing (remote reference) byvoeg by die projek waaraan jy tans werk deur die git remote add opdrag uit te voer, soos ons in Git Basics gedek het. Noem hierdie remote teamone, wat jou kortnaam (shortname) vir daardie hele URL sal wees.

Adding another server as a remote
Figure 33. Voeg nog 'n bediener as 'n remote by

Nou kan jy git fetch teamone uitvoer om alles af te haal (fetch) wat die afgeleë teamone bediener het wat jy nog nie het nie. Omdat daardie bediener 'n subset het van die data wat jou origin bediener op die oomblik het, haal Git geen data af nie, maar stel 'n remote-tracking tak genaamd teamone/master op om te wys na die vaslegging (commit) wat teamone as sy master tak het.

Remote-tracking branch for `teamone/master`
Figure 34. Remote-tracking tak vir teamone/master

Opstuur (Pushing)

Wanneer jy 'n tak met die wêreld wil deel, moet jy dit opstuur (push) na 'n remote waartoe jy skryftoegang het. Jou plaaslike takke word nie outomaties gesinchroniseer met die remotes waarna jy skryf nie — jy moet die takke wat jy wil deel, eksplisiet push. Op dié manier kan jy privaat takke gebruik vir werk wat jy nie wil deel nie, en slegs die onderwerp-takke (topic branches) push waaraan jy wil saamwerk.

As jy 'n tak genaamd serverfix het waaraan jy saam met ander wil werk, kan jy dit op dieselfde manier push as wat jy jou eerste tak gepush het. Voer git push <remote> <branch> uit:

$ 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

Dit is 'n bietjie van 'n kortpad. Git brei outomaties die serverfix taknaam uit na refs/heads/serverfix:refs/heads/serverfix, wat beteken, “Neem my serverfix plaaslike tak en push dit om die remote se serverfix tak op te dateer.” Ons sal in Git Internals in detail deur die refs/heads/ deel gaan, maar jy kan dit oor die algemeen uitlaat. Jy kan ook git push origin serverfix:serverfix doen, wat dieselfde ding doen — dit sê, “Neem my serverfix en maak dit die remote se serverfix.” Jy kan hierdie formaat gebruik om 'n plaaslike tak te push na 'n afgeleë tak wat anders genoem word. As jy nie wou hê dit moet serverfix op die remote genoem word nie, kon jy in plaas daarvan git push origin serverfix:awesomebranch uitvoer om jou plaaslike serverfix tak na die awesomebranch tak op die afgeleë projek te push.

Note
Moenie jou wagwoord elke keer tik nie

As jy 'n HTTPS URL gebruik om oor te push, sal die Git-bediener jou vra vir jou gebruikersnaam en wagwoord vir verifikasie (authentication). By verstek (by default) sal dit jou op die terminaal vir hierdie inligting vra sodat die bediener kan vasstel of jy toegelaat word om te push.

As jy dit nie elke liewe keer wil intik wanneer jy push nie, kan jy 'n “credential cache” opstel. Die eenvoudigste is om dit net vir 'n paar minute in die geheue te hou, wat jy maklik kan opstel deur git config --global credential.helper cache uit te voer.

Vir meer inligting oor die verskillende credential caching opsies wat beskikbaar is, sien Die Stoor van Aanmeldbewyse (Credential Storage).

Die volgende keer as een van jou medewerkers van die bediener afhaal (fetch), sal hulle 'n verwysing kry na waar die bediener se weergawe van serverfix is onder die afgeleë tak 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

Dit is belangrik om daarop te let dat wanneer jy 'n fetch doen wat nuwe remote-tracking takke aftrek, jy nie outomaties plaaslike, redigeerbare kopieë daarvan het nie. Met ander woorde, in hierdie geval het jy nie 'n nuwe serverfix tak nie — jy het slegs 'n origin/serverfix wyser wat jy nie kan verander nie.

Om hierdie werk in jou huidige werkstak in te smelt (merge), kan jy git merge origin/serverfix uitvoer. As jy jou eie serverfix tak wil hê waarop jy kan werk, kan jy dit op jou remote-tracking tak baseer:

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

Dit gee jou 'n plaaslike tak waaraan jy kan werk wat begin waar origin/serverfix is.

Naspeur-takke (Tracking Branches)

Om 'n plaaslike tak vanaf 'n remote-tracking tak uit te check (checkout), skep outomaties wat 'n “tracking branch” (naspeur-tak) genoem word (en die tak wat dit naspeur, word 'n “upstream branch” of stroomop-tak genoem). Tracking branches is plaaslike takke wat 'n direkte verhouding met 'n afgeleë tak (remote branch) het. As jy op 'n tracking branch is en git pull tik, weet Git outomaties van watter bediener om af te haal (fetch) en watter tak om in te smelt (merge).

Wanneer jy 'n bewaarplek (repository) kloon, skep dit oor die algemeen outomaties 'n master tak wat origin/master naspeur (track). Jy kan egter ander tracking branches opstel as jy wil — takke wat takke op ander remotes naspeur, of wat nie die master tak naspeur nie. Die eenvoudige geval is die voorbeeld wat jy pas gesien het, deur git checkout -b <branch> <remote>/<branch> uit te voer. Dit is 'n algemene genoeg operasie dat Git die --track kortpad bied:

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

Trouens, dit is so algemeen dat daar selfs 'n kortpad vir daardie kortpad is. As die taknaam wat jy probeer uitcheck (a) nie bestaan nie en (b) presies ooreenstem met 'n naam op slegs een remote, sal Git 'n tracking branch vir jou skep:

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

Om 'n plaaslike tak met 'n ander naam as die afgeleë tak op te stel, kan jy maklik die eerste weergawe met 'n ander plaaslike taknaam gebruik:

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

Nou sal jou plaaslike tak sf outomaties van origin/serverfix af aftrek (pull).

As jy reeds 'n plaaslike tak het en dit wil koppel aan 'n afgeleë tak wat jy pas afgetrek het, of as jy die stroomop-tak (upstream branch) wat jy naspeur wil verander, kan jy die -u of --set-upstream-to opsie saam met git branch gebruik om dit enige tyd eksplisiet in te stel.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
Stroomop (Upstream) kortpad

Wanneer jy 'n tracking branch opgestel het, kan jy na sy stroomop-tak (upstream branch) verwys met die @{upstream} of @{u} kortpad. Dus, as jy op die master tak is en dit spoor origin/master na, kan jy iets soos git merge @{u} gebruik in plaas van git merge origin/master as jy wil.

As jy wil sien watter tracking branches jy opgestel het, kan jy die -vv opsie saam met git branch gebruik. Dit sal jou plaaslike takke lys met meer inligting, insluitend wat elke tak naspeur en of jou plaaslike tak voor (ahead), agter (behind), of albei is.

$ 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

So hier kan ons sien dat ons iss53 tak origin/iss53 naspeur en twee “ahead” is, wat beteken dat ons plaaslik twee vasleggings (commits) het wat nog nie na die bediener gepush is nie. Ons kan ook sien dat ons master tak origin/master naspeur en op datum (up to date) is. Vervolgens kan ons sien dat ons serverfix tak die server-fix-good tak op ons teamone bediener naspeur en drie voor is en een agter is, wat beteken dat daar een vaslegging op die bediener is wat ons nog nie ingesmelt (merged) het nie en drie vasleggings plaaslik is wat ons nog nie gepush het nie. Laastens kan ons sien dat ons testing tak geen afgeleë tak naspeur nie.

Dit is belangrik om daarop te let dat hierdie nommers slegs akkuraat is sedert die laaste keer wat jy van elke bediener af afgehaal (fetched) het. Hierdie opdrag maak nie kontak met die bedieners nie; dit vertel jou net van wat dit plaaslik van hierdie bedieners af gekas (cached) het. As jy heeltemal op datum voor- en agter-nommers wil hê, sal jy van al jou remotes moet fetch net voordat jy hierdie uitvoer. Jy kan dit so doen:

$ git fetch --all; git branch -vv

Aftrek (Pulling)

Terwyl die git fetch opdrag al die veranderings op die bediener sal afhaal wat jy nog nie het nie, sal dit jou werkgids (working directory) glad nie verander nie. Dit sal bloot die data vir jou kry en jou toelaat om dit self saam te smelt (merge). Daar is egter 'n opdrag genaamd git pull wat in die meeste gevalle in wese 'n git fetch is, onmiddellik gevolg deur 'n git merge. As jy 'n tracking branch opgestel het soos in die vorige afdeling gedemonstreer, hetsy deur dit eksplisiet in te stel of deur dit vir jou te laat skep deur die clone of checkout opdragte, sal git pull kyk watter bediener en tak jou huidige tak naspeur, van daardie bediener afhaal (fetch) en dan probeer om daardie afgeleë tak (remote branch) in te smelt.

Afgeleë Takke Uitvee (Deleting Remote Branches)

Veronderstel jy is klaar met 'n afgeleë tak — sê nou jy en jou medewerkers is klaar met 'n kenmerk (feature) en het dit in jou remote se master tak (of watter tak jou stabiele kodelyn ook al in is) saamgesmelt (merged). Jy kan 'n afgeleë tak uitvee deur die --delete opsie saam met git push te gebruik. As jy jou serverfix tak van die bediener wil uitvee, voer jy die volgende uit:

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

Al wat dit basies doen, is om die wyser (pointer) van die bediener af te verwyder. Die Git-bediener sal oor die algemeen die data daar hou vir 'n rukkie totdat 'n vullisverwyderingsproses (garbage collection) loop, so as dit per ongeluk uitgevee is, is dit dikwels maklik om te herstel.