Close

Git-vertakkingen en -upstreams: instructies en een coole tip

Headshot van Nicola Paolucci
Nicola Paolucci

Developer Advocate


Door projecten te vertakken om je eigen wijzigingen aan te brengen, kun je eenvoudig je eigen bijdragen integreren. Maar als je die wijzigingen niet stroomopwaarts stuurt (wat betekent dat je ze naar de bovenliggende repository terugstuurt), loop je het risico ze uit het oog te verliezen, wat kan leiden tot uiteenlopende regels in je repository. Om er zeker van te zijn dat alle bijdragers zich op dezelfde bron baseren, moet je enkele principes kennen over hoe git forking samenwerkt met git upstream. In dit blog laat ik je kennismaken met de basisprincipes en de valkuilen, en ik geef je zelfs een leuke tip om je een voorsprong te geven.

Git upstream: op de hoogte blijven en bijdragen


Laat ik beginnen met een gedetailleerde beschrijving van een algemene installatie en de eenvoudigste workflow voor interactie met upstream repository's.

In een standaardinstallatie heb je doorgaans een origin en een upstream externe locatie. De laatste is de poortwachter van het project of de bron van de waarheid waaraan je wilt bijdragen.

Controleer eerst of je al een externe locatie hebt ingesteld voor de upstream repository, en hopelijk ook een origin:

git remote -v

origin  git@bitbucket.org:my-user/some-project.git (fetch)
origin  git@bitbucket.org:my-user/some-project.git (push)

Als je geen upstream repository hebt, kun je die eenvoudig toevoegen met de opdracht remote:

git remote add upstream git@bitbucket.org:some-gatekeeper-maintainer/some-project.git
Databases
gerelateerd materiaal

Een volledige Git-repository verplaatsen

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

Controleer of de externe locatie juist is toegevoegd:

git remote -v

origin    git@bitbucket.org:my-user/some-project.git (fetch)
origin    git@bitbucket.org:my-user/some-project.git (push)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (fetch)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (push)

Nu kun je de laatste wijzigingen van de upstream repository verzamelen met fetch. Herhaal dit elke keer als je op de hoogte wilt blijven:

(Als het project tags heeft die niet met main zijn samengevoegd, moet je ook 'git fetch upstream --tags' uitvoeren)

git fetch upstream

Over het algemeen wil je dat je lokale main-branch een goede kopie is van de upstream gelegen main en alle werkzaamheden uitvoeren in functie-branches, aangezien dit later pull-aanvragen kunnen worden.

Op dit moment maakt het niet uit of je merge of rebase gebruikt, aangezien het resultaat meestal hetzelfde is. Laten we merge gebruiken:

git checkout main
git merge upstream/main

Maak een functie-branch aan als je wat werk met de upstream onderhouders wilt delen waaraan je de main-branch ontleent. Voer een push uit naar de externe repository als je tevreden bent.

Je kunt in plaats daarvan ook rebase gebruiken, en dan merge om ervoor te zorgen dat de upstream repository een duidelijke set commits heeft (bij voorkeur één) om te evalueren:

git checkout -b feature-x

#some work and some commits happen
#some time passes

git fetch upstream
git rebase upstream/main

Publiceren met git fork


Na de bovenstaande stappen publiceer je je werk in je externe vertakking met een simpele push:

git push origin feature-x
git push -f origin feature-x

Persoonlijk geef ik er de voorkeur aan om de geschiedenis zo overzichtelijk mogelijk te houden en voor optie drie te kiezen, maar elk team heeft zijn eigen workflow. NB: doe dit alleen als je met je eigen vertakking werkt. Herschrijf NOOIT de geschiedenis van gedeelde repository's en branches.

Tip van de dag: eerdere/latere cijfers in de prompt


Na een fetch laat de git-status zien hoeveel commits je voor of achter bent ten opzichte van de gesynchroniseerde externe branch. Zou het niet fijn zijn als je deze informatie in je trouwe opdrachtprompt zou kunnen zien? Dat dacht ik ook, dus begon ik te tikken met mijn bash-eetstokjes, waarna ik alles voor je heb voorgekookt.

Zo ziet het eruit in je prompt als je deze eenmaal hebt geconfigureerd:

nick-macbook-air:~/dev/projects/stash[1|94]$

Dit moet je aan je .bashrc of vergelijkbare functie toevoegen. Het gaat om slechts één enkele functie:

function ahead_behind {
    curr_branch=$(git rev-parse --abbrev-ref HEAD);
    curr_remote=$(git config branch.$curr_branch.remote);
    curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);
    git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';
}
export PS1="\h:\w[\$(ahead_behind)]$"

Het werk achter de schermen

Hier beschrijven we voor liefhebbers van details en uitleg hoe het werkt:

We krijgen de symbolische naam voor de huidige HEAD, d.w.z. de huidige branch:

curr_branch=$(git rev-parse --abbrev-ref HEAD);

We krijgen de externe locatie waarnaar de huidige branch verwijst:

curr_remote=$(git config branch.$curr_branch.remote);

We krijgen de branch waarin deze externe locatie moet worden samengevoegd (met een goedkope Unix-truc om alles weg te gooien tot en met de laatste slash naar voren [ / ]):

curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);

Nu hebben we wat we nodig hebben om het aantal tellingen te verzamelen voor de commits waar we voor of achter staan:

git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';

We gebruiken de stokoude Unix tr om de TAB om te zetten in een scheidingsteken |.

Aan de slag met git upstream


Dit is een eenvoudige uitleg over git upstream — hoe je een git upstream instelt, een nieuwe branch maakt, wijzigingen verzamelt, publiceert met git-vertakking, en een leuke tip voor hoeveel commits je voor- of achterloopt op je externe branch.

Bitbucket Data Center bevat synchronisatie van vertakkingen, waardoor de ontwikkelaar wordt verlost van alle last om op de hoogte te blijven van zijn vertakkingen. Bitbucket Cloud heeft bovendien een eenvoudige synchronisatie in één stap. Bekijk die eens!

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up