Remote branches
Remote branches zijn referenties naar de staat van de branches op je remote repositories. Ze zijn lokale branches die jij niet kunt verplaatsen; ze worden automatisch verplaatst zodra je wat netwerk communicatie doet. Remote branches gedragen zich als boekenleggers om je eraan te helpen herinneren waar de branches op je remote repositories waren de laatste keer dat je met ze in contact was.
Ze hebben de vorm (remote)/(branch)
. Bijvoorbeeld, als je wil zien hoe de master
branch op je origin
er uit zag vanaf de laatste dat je er mee gecommuniceerd hebt, dan zou je de origin/master
branch bekijken. Als je aan het werk bent aan een probleem met een partner en zij hebben een iss53
branch teruggezet, dan zou je je eigen lokale iss53
kunnen hebben; maar de branch op de server zou wijzen naar de commit op origin/iss53
.
Dit kan wat verwarrend zijn, dus laten we eens naar een voorbeeld kijken. Stel dat je een Git server op je netwerk hebt op git.ourcompany.com
. Als je hiervan cloned dan wordt die automatisch origin
voor je genoemd, Git haalt al zijn gegevens binnen, maakt een verwijzing naar waar zijn master
branch is, en noemt dat lokaal origin/master
; en je kunt het niet verplaatsen. Git geeft je ook je eigen master
branch, beginnend op dezelfde plaats als de master
branch van origin, zodat je iets hebt om vanaf te werken (zie Figuur 3-22).

Figuur 3-22. Een Git clone geeft je je eigen master branch en origin/master wijzend naar de master branch van origin.
Als je wat werk doet op je lokale master branch, en in de tussentijd zet iemand anders iets terug naar git.ourcompany.com
en vernieuwt die master branch, dan zijn jullie histories verschillend vooruit geschoven. En, zolang je geen contact hebt met je origin server, zal je origin/master
verwijzing niet verplaatsen (zie Figuur 3-23).

Figuur 3-23. Lokaal werken terwijl iemand anders naar je remote server terugzet laat iedere historie anders vooruit gaan.
Om je werk te synchroniseren, voer je een git fetch origin
commando uit. Dit commando bekijkt welke server origin is (in dit geval is het git.ourcompany.com
), haalt gegevens er vanaf die je nog niet hebt, en vernieuwt je lokale gegevensbank, waarbij je origin/master
verwijzing naar zijn nieuwere positie verplaatst wordt (zie Figuur 3-24).

Figuur 3-24. Het git fetch commando vernieuwt je remote referenties.
Om het hebben van meerdere remote servers te demonstreren en hoe remote branches voor die remote projecten er uit zien, laten we eens aannemen dat je nog een interne Git server hebt, die alleen wordt gebruikt voor ontwikkeling gedaan door een van je sprint teams. Deze server bevindt zich op git.team1.ourcompany.com
. Je kunt het als een nieuwe remote referentie toevoegen aan het project waar je nu aan werkt door het git remote add
commando uit te voeren, zoals we behandeld hebben in Hoofdstuk 2. Noem deze remote teamone
, wat je afkorting voor die hele URL wordt (zie Figuur 3-25).

Figuur 3-25. Een andere server als een remote toevoegen.
Nu kun je git fetch teamone
uitvoeren om alles op te halen dat de teamone
server heeft en jij nog niet. Omdat server een subset is van de gegevens die je origin
server op dit moment heeft, haalt Git geen gegevens maar stelt een remote branch genaamd teamone/master
in om te wijzen naar de commit die teamone
heeft naar zijn master
branch (zie Figuur 3-26).

Figuur 3-26. Je krijgt lokaal een referentie naar de positie van teamone’s master branch.
Terugzetten
Als je een branch wil delen met de wereld, dan moet je het naar een remote terugzetten waar je schrijftoegang op hebt. Je lokale branches worden niet automatisch gesynchroniseerd met de remotes waar je naar schrijft — je moet de branches die je wilt delen expliciet terugzetten. Op die manier, kun je privé branches gebruiken voor werk dat je niet wil delen, en alleen de onderwerp branches terugzetten waar je op wilt samenwerken.
Als je een branch genaamd serverfix
hebt, waar je met anderen aan wilt werken, dan kun je die terugzetten op dezelfde manier waarop je je eerste branch hebt teruggezet. Voer git push (remote) (branch)
uit:
$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new branch] serverfix -> serverfix
Dit is een beetje kort door de bocht. Git zal de serverfix
branchnaam automatisch expanderen naar refs/heads/serverfix:refs/heads/serverfix
, wat betekent “Neem mijn lokale serverfix branch en zet dat terug om de serverfix branch van de remote te vernieuwen.”. We zullen in detail over het refs/heads
gedeelte gaan hebben in Hoofdstuk 9, maar je kunt het over het algemeen weglaten. Je kun ook git push origin serverfix:serverfix
doen, wat hetzelfde doet — het zegt, “Neem mijn serverfix en maak het de serverfix van de remote.” Je kunt dit formaat gebruiken om een lokale branch terug te zetten naar een remote branch die anders heet. Als je niet wil dat het serverfix
heet aan de remote kant, kun je in plaats daarvan git push origin serverfix:awesomebranch
gebruiken om je lokale serverfix
branch naar de awesomebranch
op het remote project terug te zetten.
De volgende keer dat één van je medewerkers van de server fetched, zullen ze een referentie krijgen naar waar de servers versie van serverfix
is onder de remote branch origin/serverfix
:
$ git fetch origin
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
From git@github.com:schacon/simplegit
* [new branch] serverfix -> origin/serverfix
Het is belangrijk om op te merken dat als je een fetch doet die nieuwe remote branches ophaalt, je niet automatisch lokale, aanpasbare kopieën daarvan hebt. In andere woorden, in dit geval heb je geen nieuwe serverfix
branch — je hebt alleen een origin/serverfix
verwijzing die je niet kunt aanpassen.
Om dit werk in je huidige werk branch samen te voegen, kun je git merge origin/serverfix
uitvoeren. Als je je eigen serverfix
branch wilt waar je op kunt werken, dan kun je deze vanaf je remote branch baseren:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
Dit geeft je een lokale branch waar je op kunt werken, die begint met waar origin/serverfix
is.
Volg branches
Een lokale branch uitchecken van een remote branch creëert automatisch een zogenaamde volg branch (_tracking branch_). Volg branches zijn lokale branches die een directe releatie met een remote branch hebben. Als je op een volg branch zit en git push typt, dat weet Git automatisch naar welke server en branch hij moet terugzetten. En, terwijl je op een van die branches zit zal het uitvoeren van git pull
alle remote referenties ophalen en ze automatisch in de corresponderende remote branch samenvoegen.
Als je een repository cloned, zal het over het algemeen automatisch een master
branch aanmaken, die origin/master
volgt. Daarom werken git push
en git pull
zo uit het doosje, zonder verdere argumenten. Maar, kun je kunt ook andere volg branches instellen als je dat wilt — anderen die niet branches volgen op origin
en niet de master
branch volgen. Het eenvoudige geval is het voorbeeld dat je zojuist zag, git checkout -b [branch] [remotenaam]/[branch]
uitvoeren. Als je Git versie 1.6.2 of nieuwer hebt, kun je ook de --track
afkorting gebruiken:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
Om een lokale branch in te stellen met een andere naam dan de remote branch, kun je eenvoudig de eerste versie met een andere lokale branch naam gebruiken:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
Nu zal je lokale sf branch automatisch halen en terugzetten van origin/serverfix.
Remote branches verwijderen
Stel dat je klaar bent met een remote branch — stel dat jij en je medewerkers klaar zijn met een eigenschap en het hebben samengevoegd in je master
branch van je remote (of welke branch je stabiele codelijn ook in zit). Dan kun je een remote branch verwijderen door de nogal stompzinnige syntax git push [remotenaam] :[branch]
te gebruiken. Als je je serverfix
branch van de server wilt verwijderen, dan voer je het volgende uit:
$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
- [deleted] serverfix
Boem. Geen branch meer op je server. Je zult deze pagina wel een ezelsoor willen geven, omdat je dat commando nodig hebt, en je het waarschijnlijk zult vergeten. Een manier om dit commando te onthouden is door de git push [remotenaam] [lokalebranch]:[remotebranch]
syntax te onthouden die we iets eerder behandeld hebben. Als je het [lokalebranch]
gedeelte weglaat, dan zeg je in feite, “Neem iets willekeurigs aan mijn kant en maak dat de [remotebranch]
.”