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.
Bitbucket-blog
DevOps-leertraject