Close

Pull-aanvraag voor Git Fetch: de sleutel tot professionaliteit

Headshot van Nicola Paolucci
Nicola Paolucci

Developer Advocate


Tegenwoordig is het toepassen van een oplossing op een project net zo eenvoudig als het maken van een vertakking - wat een volledige kopie op afstand oplevert van het project dat je kunt hacken - het bestand selecteren dat je wilt wijzigen, op Bewerken drukken en je correcties vastleggen.

Wat als je in plaats daarvan aan de ontvangende kant staat van een pull request (afgekort PR in het volgende)? Het gebruik van een gepolijste webinterface is geweldig en vaak is dat alles wat je nodig hebt. Klik op een knop om goed te keuren, klik op een knop om samen te voegen en je bent klaar.

Maar dat is niet altijd het geval! Het komt vaak voor dat je de wijzigingen in een pull request (PR) lokaal moet downloaden, een paar testen moet uitvoeren om te kijken hoe ze eruitzien in je IDE om te begrijpen wat er is gedaan.

De stappen - in het bijzonder fetch en checkout - om de pull requests te downloaden van je collega of bijdrager zijn conceptueel eenvoudig, maar ze worden nog eenvoudiger als je een paar belangrijke details en tips kent.

Laat me je dus een beter begrip geven van de opdrachtregelfaciliteiten van git waarmee je pull requests van de opdrachtregel gemakkelijk kunt afhandelen.

Voor we beginnen: verrijk je shell-prompt met de naam en status van je branch


Het verbaast me altijd hoeveel mensen een kale opdrachtprompt hebben die niet aangeeft in welke git-branch ze zich bevinden en of ze gewijzigde/niet-vastgelegde bestanden in hun werkmap hebben. Als je dacht: Hé, dat ben ik! - wil ik je graag helpen en tegelijkertijd versteld te laten staan!

Doe jezelf een plezier en installeer iets als de geweldige liquid prompt die je uitstekende aantekeningen geeft over de status van je git-werkmap (en die ook alle andere VCS ondersteunt):

(In de schermafbeelding hierboven zie je een melding dat ik in branch Newbranch zit en dat ik 5 regels heb toegevoegd aan de bestanden die ik volg in mijn werkmap en dat ik er 0 heb verwijderd)

Git-logo
gerelateerd materiaal

Git installeren

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

Iedereen die in dezelfde repository werkt


Als je met je team in dezelfde repository werkt, is het proces om een pull request te bekijken heel eenvoudig: je hoeft alleen fetch en checkout uit te voeren op de branch van waaruit de pull request is aangemaakt:

  • Bekijk alle branches die zijn gepubliceerd in je gedeelde repository:
git fetch origin
  • Creëer een lokale branch die de externe branch volgt waarin je geïnteresseerd bent:
git checkout -b PRJ-1234 origin/PRJ-1234
  • Nu kun je differentiëren, samenvoegen en testen naar hartenlust:
git diff main ./run-tests.sh
  • Als je tevreden bent, ga dan terug naar de webinterface en geef feedback of geef de wijziging je Goedkeuring.

Bijdragers die in hun eigen vertakkingen werken


Het proces verandert een beetje wanneer sommige bijdragers in verschillende vertakkingen werken. In dat geval kun je de externe branch ophalen waar de bijdrage of functie werd vastgelegd:

  • Voeg eerste de externe branch van de bijdrager toe:
git remote add jsmith http://bitbucket.org/jsmith/coolproject.git
  • Verzamel eerst de recentste updates van origin, je belangrijkste repository:
git checkout main git fetch origin git merge main
  • Bekijk alle branches die zijn gepubliceerd op de vertakking van de bijdrager:
git fetch jsmith
  • Creëer een lokale branch die de externe branch volgt waarin je geïnteresseerd bent:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
  • Nu kun je differentiëren, samenvoegen en testen naar hartenlust:
git diff main ./run-tests.sh

Minder werk met behulp van refs van pull requests


Het bovenstaande werkt, maar er zijn verschillende dingen die de situatie lastiger kunnen maken:

  • Wat als je veel partners hebt, elk met hun eigen vertakkingen? Het optellen en apart verwerken van al deze vertakkingen is een onpraktische werkwijze.
  • Wat als je niet eens toegang hebt tot sommige van de vertakkingen en je kunt de bronbranch niet uitchecken?

De oplossing voor beide bovenstaande problemen is het gebruik van pull requests die door sommige git-servers worden aangeboden. De procedure die ik laat zien, wordt ondersteund door sommige git-servers en varieert enigszins, afhankelijk van de server die je gebruikt. Hieronder zal ik uitleggen hoe je alle pull requests op Stash (nu Bitbucket Server) en Github kunt ophalen.

Wees niet bang voor de Refspecs

De eerste vereiste is om jezelf vertrouwd te maken met Refspecs. Refspecs zijn cool en je hoeft niet bang voor ze te zijn. Het zijn eenvoudige toewijzingen van externe branches naar lokale referenties, met andere woorden: een eenvoudige manier om git te vertellen dat 'deze externe branch (of deze set van externe branches) lokaal aan deze namen gekoppeld moet worden, in deze naamspace.'

Bijvoorbeeld een opdracht zoals:

git fetch +refs/heads/main:refs/remotes/origin/main

Het brengt de externe branch main in kaart op je externe origin naar een lokale origin/main zodat je het volgende kunt typen:

git checkout origin/main

En nog steeds verwijs ik naar die branch op afstand. Het plusteken (+) in de definitie staat er om aan te geven dat we willen dat git de referentie bijwerkt, ook al is het geen 'fast forward'.

De manier waarop we dit gebruiken om alle pull requests te downloaden, is door in kaart te brengen hoe de externe repository de PR-HEAD's opslaat, en ze toe te wijzen aan een lokale naamspace zodat ze gemakkelijk geraadpleegd kunnen worden.

Mits je een externe gedefinieerde origin (of upstream) hebt, kun je het volgende doen.

Opmerking: Zoals terecht opgemerkt door verschillende ontwikkelaars van Stash (nu Bitbucket Server), worden de refs die ik hieronder demonstreer beschouwd als ongedocumenteerd en privé en kunnen ze op elk moment veranderen.

Alle pull requests downloaden: Stash

  • Een repository vertakken.
  • Kloon je vertakking lokaal:
git clone git@stash.atlassian.com:durdn/tis.git
  • Voeg de oorspronkelijke repository van upstream toe als upstream.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
  • Ontvang de laatste informatie van de onderhouder 'upstream'
git fetch upstream
  • Voeg de refspec toe die pull requests op afstand in kaart brengt in een lokale pr-naamspace. Je kunt dit doen met een opdracht config:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
  • Als je in .git/config kijkt, worden de items voor fetch:
[remote "upstream"]
    url = git@stash.atlassian.com:docker/libswarm.git
    fetch = +refs/heads/*:refs/remotes/upstream/*
    fetch = +refs/pull-requests/*/from:refs/remotes/upstream/pr/*
  • Je kunt nu eenvoudig alle branches voor pull requests ophalen:
$ git fetch upstream

remote: Counting objects: 417, done.
remote: Compressing objects: 100% (274/274), done.
remote: Total 417 (delta 226), reused 277 (delta 128)
Receiving objects: 100% (417/417), 105.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (226/226), done.

From stash.atlassian.com:docker/libswarm
 * [new ref]         refs/pull-requests/10/from-> upstream/pr/10
 [...]
 * [new ref]         refs/pull-requests/100/from -> upstream/pr/100
 * [new ref]         refs/pull-requests/101/from -> upstream/pr/101
 [...]
 * [new ref]         refs/pull-requests/109/from -> upstream/pr/109
 * [new ref]         refs/pull-requests/110/from -> upstream/pr/110
 [...]
  • Om nu over te schakelen naar een bepaalde pull request kun je gewoon:
git checkout pr/102

Alle pull requests downloaden: Github

Als de vertakkingen of upstreams op Github staan, werkt dat precies zoals hierboven, maar de opdracht config wordt gewijzigd in:

 git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'

En de externe optie in .git/config wordt gewijzigd om een extra fetch-configuratie toe te voegen om de PR-managers toe te wijzen aan een lokale naamspace genaamd pr:

[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*

Eén pull request ophalen met behulp van refs

Als je geen fetch-items in je .git/config wilt instellen en je gewoon snel naar een pull request wilt gaan, werkt een enkele opdracht:

  • Eén PR in Stash uitchecken:
git fetch refs/pull-requests/your-pr-number/from:local-branch-name
  • Eén PR in Github uitchecken:
git fetch refs/pull/your-pr-number/head:local-branch-name

En als je het bovenstaande vaak gebruikt, kun je het proces stroomlijnen door een git-alias te creëren:

# For Stash
git config alias.spr '!sh -c "git fetch origin pull-requests/${1}/from:pr/${1}" -'

# For Github
git config alias.gpr '!sh -c "git fetch origin pull/${1}/head:pr/${1}" -'

Nu die alias is geconfigureerd, kunnen we een pull request ophalen met een simpele methode (bedankt inuit):

Conclusies


Ik hoop dat je dit nuttig vond! Uiteindelijk is het makkelijk om het werk van je collega's of bijdragers in de gaten te houden als je een paar eenvoudige aliassen hebt gemaakt of de juiste refspecs toevoegt aan je .git/config. Ik beantwoord graag al je vragen op Twitter via @durdn of @AtlDevtools.

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

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