Flusso di lavoro preferito di Github per l'aggiornamento di una richiesta pull dopo la revisione del codice


341

Ho inviato una modifica a un progetto Open Source su Github e ho ricevuto commenti sulla revisione del codice da uno dei membri del team principale.

Vorrei aggiornare il codice tenendo conto dei commenti della recensione e inviarlo nuovamente. Qual è il miglior flusso di lavoro per farlo? Dalla mia conoscenza limitata di git / github, ho potuto fare una delle seguenti cose:

  1. Aggiorna il codice come nuovo commit e aggiungi il commit iniziale e quello aggiornato alla mia richiesta pull.

  2. In qualche modo (??) ripristinare il vecchio commit dal mio repository e creare un nuovo nuovo commit contenente tutto, quindi sollevare una richiesta pull per quello?

  3. git commitha una funzione di modifica, ma ho sentito che non dovresti usarlo dopo aver spinto il commit al di fuori del tuo repository locale? In questo caso ho apportato la modifica sul mio PC locale e ho spinto il mio ramo github del progetto. Andrebbe bene usare "modifica"?

  4. Qualcos'altro?

Sembra che l'opzione 2/3 sarebbe piacevole, dato che il progetto open source avrebbe un solo commit nella loro storia che implementerebbe tutto, ma non sono sicuro di come farlo.

Nota: non so se questo influisce o meno sulla risposta, ma non ho apportato le modifiche in un ramo separato, ho appena eseguito un commit in cima al master

Risposte:


219

Basta aggiungere un nuovo commit al ramo usato nella richiesta pull e spingere il ramo su GitHub. La richiesta pull verrà automaticamente aggiornata con il commit aggiuntivo.

# 2 e # 3 non sono necessari. Se le persone desiderano vedere solo dove è stata unita la filiale (e non i commit aggiuntivi), possono utilizzare git log --first-parentsolo per visualizzare il commit di unione nel registro.


7
masterè anche un ramo, quindi tecnicamente non importa :)
colpire il

10
@OrionEdwards - come detto poke, master è un ramo, quindi l'aggiornamento lo farà anche eventuali richieste pull basate su di esso. (Questa è una buona ragione per usare un ramo separato per qualsiasi cosa tu abbia intenzione di inviare una richiesta pull.)
Ambra

18
Poiché il codice è ancora in fase di revisione , di solito è meglio correggere i commit piuttosto che introdurre ulteriori commit di fixup che ingombrano la cronologia ...
mgalgs

4
@mgalgs Questa è una questione di preferenza.
Ambra,

4
Non mi piace questa risposta per le ragioni spiegate nel post sul blog che ho appena scritto ; Credo che l'altra risposta sia molto meglio.
Adam Spires,

225

Per aggiornare una richiesta pull

Per aggiornare una richiesta pull (punto 1), l'unica cosa che devi fare è controllare lo stesso ramo da cui proviene la richiesta pull e spingerla di nuovo:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Facoltativo: pulizia della cronologia di commit

È possibile che venga richiesto di eliminare i commit in modo che la cronologia del repository sia pulita o che si desideri rimuovere i commit intermedi che distraggono dal "messaggio" nella richiesta pull (punto 2). Ad esempio se la cronologia del commit è simile alla seguente:

$ git remote add parent git@github.com:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

È una buona idea mettere insieme le cose in modo che appaiano come un unico commit:

$ git rebase -i parent/master 

Questo ti chiederà di scegliere come riscrivere la cronologia della tua richiesta pull, nel tuo editor sarà presente quanto segue:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Per ogni commit che desideri far parte del commit precedente, cambia pick in squash:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

E chiudi il tuo editor. Git riscriverà quindi la cronologia e ti chiederà di fornire un messaggio di commit per il commit combinato. Modificare di conseguenza e la cronologia di commit sarà ora concisa:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Spingilo sulla forcella:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To git@github.com:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

e la tua richiesta pull conterrà un unico commit, incorporando tutte le modifiche precedentemente suddivise in diversi commit.

Cambiare la storia sui repository pubblici è una cosa negativa

Riscrivere la cronologia e utilizzarla git push -fsu un ramo che, potenzialmente, qualcun altro ha già clonato è una cosa negativa: causa la divergenza della cronologia del repository e di quella del checkout.

Tuttavia, modificare la cronologia del fork per correggere il cambiamento che si propone di integrare in un repository - è una buona cosa. In quanto tale, non hai riserve che eliminano il "rumore" dalle tue richieste pull.

Una nota sui rami

Nel precedente mostro la richiesta pull come proveniente dal masterramo del fork, non c'è nulla di sbagliato in questo necessariamente ma crea alcune limitazioni come, se questa è la tua tecnica standard, essere in grado di avere solo un PR aperto per repository . È comunque un'idea migliore creare un ramo per ogni singolo cambiamento che desideri proporre:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets

28
+1 per menzionare come ripulire i commit anziché eseguire ulteriori commit di correzione.
mgalgs

3
Ho riscontrato alcuni problemi nella raccolta / compressione e questa risposta mi ha aiutato. Ho anche notato che Github ha rimosso la conversazione precedente dopo che l'ho fatto git push -f. Non c'erano molti commenti, ma è qualcosa che non mi aspettavo.
Hitesh,

5
Per essere chiari, quando ti ribelli per avere una storia pulita, stai davvero cambiando i tuoi impegni pubblici, stai solo supponendo che a nessuno importi perché è un fork.
brita_

2
Follow-up: best practice quando il master cambia durante il tuo PR?
Kevin Suttle,

1
Considera che la riscrittura della cronologia sulle richieste pull che sono state riviste (o che in generale hanno commenti / codice di riferimento) potrebbe creare confusione, poiché la cronologia non corrisponderà più ai commenti a cui si riferivano. Non esiste una soluzione semplice: qualcuno chiuderà il PR e lo riferirà in uno nuovo (per non riscrivere la storia); la mia idea sarebbe quella di fare il backup dell'ultimo SHA di commit che viene ripristinato / riscritto e di riferirlo in un commento sul PR, dopo che è stata eseguita la spinta forzata. Se IF prune non rimuove quel commit distaccato, la sua cronologia corrisponderà comunque ai commenti di PR.
Kamafeather,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.