Pull-aanvraag voor Git Fetch: de sleutel tot professionaliteit
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 - door het bestand te selecteren dat je wilt wijzigen, op Bewerken te drukken en je correcties vast te leggen.
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)
gerelateerd materiaal
Git installeren
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-referenties 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 leg ik uit hoe je alle pull requests op Stash (nu Bitbucket Data Center) 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 Data Center), worden de referenties 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 lokalepr
-naamspace. Je kunt dit doen met een opdrachtconfig
:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
- Als je in
.git/config
kijkt, worden de items voorfetch
:
[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):
Conclusie
Het wordt makkelijk om het werk van je collega's of bijdragers in de gaten te houden als je een paar eenvoudige aliassen hebt aangemaakt of de juiste refspecs toevoegt aan je .git/config
.
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.