Pull request Git Fetch: competenza sbloccata
Nicola Paolucci
Developer Advocate
Oggi, applicare una correzione a un progetto è facile: basta creare un fork (che fa apparire per magia una copia remota completa del progetto su cui lavorare), selezionare il file da modificare, premere Modifica ed eseguire il commit delle correzioni.
E se invece fossimo i destinatari di una pull request (abbreviato in PR di seguito)? Un'elegante interfaccia utente web è spesso tutto ciò che serve. Basta cliccare su un pulsante per approvare, su un altro per eseguire il merge e il gioco è fatto.
Ma non è sempre così. È comune dover scaricare localmente le modifiche incluse in una pull request (PR), eseguire alcuni test e vedere come appaiono nello strumento IDE per dare un senso alle operazioni eseguite.
I passaggi scaricare, ovvero eseguire i comandi fetch
e checkout
, le pull request dei colleghi o dei collaboratori sono concettualmente semplici, ma lo diventano ancora di più se si conoscono alcuni dettagli e suggerimenti importanti.
Di seguito descriverò i servizi a riga di comando offerti da git
per gestire le pull request dalla riga di comando con facilità.
Prima di iniziare: arricchisci il prompt della shell con il nome e lo stato del branch
Resto sempre molto sorpreso da quante persone abbiano un prompt dei comandi semplice in cui non è mostrato il branch git
attivo o se sono presenti file modificati o di cui non è stato eseguito il commit nella directory di lavoro. Se ti ritrovi in questa descrizione, permettimi di aiutarti e sorprenderti allo stesso tempo!
Installa uno strumento simile al fantastico Liquid Prompt, in grado di fornire ottime annotazioni sullo stato della directory di lavoro git
(e di supportare anche qualsiasi altro VCS):
(Nella screenshot qui sopra vedi il messaggio del prompt che mi avvisa che mi trovo nel branch newbranch
, che ho aggiunto 5
righe ai file che monitoro nella directory di lavoro e che ne ho rimosse 0
)
materiale correlato
Installa Git
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Per chi lavora nello stesso repository
Se lavori nello stesso repository del team, il processo di estrazione di una pull request è molto semplice: basta eseguire i comandi fetch
e checkout
per il branch da cui è stata creata la pull request:
- Ottieni tutti i branch pubblicati nel repository condiviso:
git fetch origin
- Crea un branch locale che tenga traccia del branch remoto che ti interessa:
git checkout -b PRJ-1234 origin/PRJ-1234
- Ora puoi eseguire i comandi
diff
,merge
e procedere ai test:
git diff main ./run-tests.sh
- Quando tutto è come desideri, torna all'interfaccia utente web e lascia un feedback o approva la modifica a titolo definitivo.
Collaboratori che lavorano sui propri fork
Il processo cambia leggermente quando alcuni dei collaboratori lavorano su fork separati. In questo caso, puoi eseguire il comando fetch
per il branch remoto in cui è stato eseguito il commit del contributo o della funzione:
- Aggiungi prima il repository remoto del collaboratore:
git remote add jsmith http://bitbucket.org/jsmith/coolproject.git
- Raccogli tutti gli ultimi aggiornamenti da
origin
, il repository principale:
git checkout main git fetch origin git merge main
- Ottieni tutti i branch pubblicati sul fork del collaboratore:
git fetch jsmith
- Crea un branch locale che tenga traccia del branch remoto che ti interessa:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
- Ora puoi eseguire i comandi
diff
,merge
e procedere ai test:
git diff main ./run-tests.sh
Ridurre il lavoro utilizzando i riferimenti delle pull request
I processi illustrati sopra sono molto utili, ma potrebbero verificarsi diversi problemi:
- Cosa fare se ci sono molti collaboratori, ognuno con i propri fork? Aggiungere tutti i fork e gestirli separatamente diventa poco pratico.
- Cosa fare se non si dispone nemmeno dell'accesso ad alcuni fork e non è possibile estrarre il branch di origine?
La soluzione a entrambi questi ticket consiste nell'usare i riferimenti delle richieste pull forniti da alcuni server Git. La procedura che mostrerò è supportata da alcuni server Git
e varia leggermente a seconda di quello in uso. Di seguito spiegherò come recuperare
tutte le richieste pull su Stash (ora chiamato Bitbucket Data Center) e Github.
Non aver paura delle specifiche di riferimento
Il primo prerequisito è acquisire familiarità con le specifiche di riferimento: sono elementi utili che non devono metterti in soggezione. Si tratta di semplici mappature dai branch remoti ai riferimenti locali, in altre parole un modo semplice per comunicare a git
che un determinato branch remoto (o set di branch remoti) deve essere mappato in locale a determinati nomi, in un determinato spazio dei nomi.
Ad esempio un comando come:
git fetch +refs/heads/main:refs/remotes/origin/main
mapperà il branch remoto main
nel repository origin
remoto a un repository origin/main
locale in modo che tu possa digitare:
git checkout origin/main
e fare comunque riferimento a quel determinato branch remoto. Il segno più (+
) nella definizione indica che vogliamo che git
aggiorni il riferimento anche se non si tratta di un'operazione con avanzamento rapido.
Il modo in cui usiamo questo comando per scaricare tutte le pull request consiste nel mappare il modo in cui il repository remoto archivia gli HEADS delle pull request e nel mapparli a uno spazio dei nomi locale per consultarli con facilità.
Quindi, a condizione che tu abbia definito un repository origin
(o upstream
) remoto, ecco cosa fare.
Nota: come giustamente osservato da diversi sviluppatori di Stash (ora chiamato Bitbucket Data Center), i riferimenti che mostrerò di seguito sono considerati non documentati
e privati
e potrebbero cambiare in qualsiasi momento.
Download di tutte le pull request: Stash
- Esegui un fork di un repository.
- Clona il fork localmente:
git clone git@stash.atlassian.com:durdn/tis.git
- Aggiungi il repository originale upstream come
upstream
.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
- Ottieni gli heads più recenti dal manutentore "upstream"
git fetch upstream
- Aggiungi i
refspec
che mapperanno gli heads delle pull request remoti a uno spazio dei nomipr
locale. Puoi farlo utilizzando un comandoconfig
:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
- Se guardi in
.git/config
, le voci del comandofetch
diventano:
[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/*
- Ora puoi recuperare con facilità tutti i branch delle pull request eseguendo il comando
fetch
:
$ 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
[...]
- Ora, per passare a una determinata pull request, puoi semplicemente eseguire:
git checkout pr/102
Download di tutte le pull request: Github
Se i fork o gli upstream si trovano su Github, il processo è lo stesso di quello illustrato sopra, ma il comando config
cambia in:
git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'
E il repository remoto in .git/config
cambierà in modo da includere una configurazione di fetch
aggiuntiva per mappare gli heads della pull request a uno spazio dei nomi locale chiamato pr
:
[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*
Recuperare una singola pull request tramite i riferimenti
Se non vuoi configurare le voci del comando fetch
in .git/config
e desideri solo accedere rapidamente a una pull request, serve un solo comando:
- Estrai una singola pull request in Stash:
git fetch refs/pull-requests/your-pr-number/from:local-branch-name
- Estrai una singola pull request in Github:
git fetch refs/pull/your-pr-number/head:local-branch-name
E se ti accorgi di usare spesso questo processo, puoi semplificarlo creando un alias git
:
# 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}" -'
Tramite questo alias configurato è possibile recuperare una pull request con un semplice comando (grazie a inuit):
Conclusione
Tenere sotto controllo il lavoro dei tuoi colleghi o collaboratori è facile dopo aver creato un paio di semplici alias o aver aggiunto le specifiche di riferimento appropriate a .git/config
.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.