Git-vertakkingen en -upstreams: instructies en een coole tip
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
gerelateerd materiaal
Een volledige Git-repository verplaatsen
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!
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.