2012-04-13 18 views
67

Ho aperto una richiesta pull a rails repository su github utilizzando Fork & Modifica il file file.github: aggiunta di commit alla richiesta di pull esistente

Ora, Dopo aver ottenuto un feedback sul mio PR, ho voluto aggiungere più commit. quindi ecco cosa ho concluso facendo

$ git clone [email protected]:gaurish/rails.git #my forked repo 
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened 
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR 
$ git commit -am "Changes done as per feedback" 
$ git push origin patch-3 

Questo ha funzionato bene ma sembra un flusso di lavoro piuttosto complesso. Forse ho sbagliato qualcosa di sbagliato qui?

la mia domanda è: Sto facendo questo il modo corretto? se no, allora qual è il modo corretto per farlo?

+3

Alcuni utenti potrebbero trovare ciò che meglio si adatta al loro scenario: http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS

+3

Ho trovato anche questa versione della domanda/risposta più chiara: http://stackoverflow.com/questions/7947322/preferred-github-workflow-for-updating-a-pull-request-after-code-review?rq=1 –

risposta

45

Dal momento che si sta utilizzando gli strumenti di GitHub e solo cambiando un file, si potrebbe anche browse to the file su GitHub, selezionare il ramo corretto dall'angolo in alto a sinistra sotto "l'albero:" discesa (patch-3 nel tuo caso), e ora scegliere "Modifica questo file". Ora le modifiche saranno impegnati a questo ramo e apparirà nella vostra richiesta di pull

+0

fantastico, grazie. – Magne

4

È inoltre possibile creare una nuova richiesta di pull che è associata a master anziché una specifica revisione abc1234.

In questo modo, qualsiasi nuovo impegno/push al repository verrà aggiunto alla richiesta di pull.

7

Ho da poco blogged su questo argomento:

Come manteniamo questo ramo caratteristica fino ad oggi? Unire i più recenti commit upstream è facile, ma si vuole evitare di creare un commit merge, in quanto ciò non sarà apprezzato quando viene spinto a monte: si stanno quindi effettivamente riprendendo le modifiche upstream, e quelle commit upstream otterranno un nuovo hash (come ottengono un nuovo genitore). Questo è particolarmente importante, poiché quei commit uniti si rifletteranno nella richiesta pull di Github quando si invieranno quegli aggiornamenti al proprio ramo di funzione github personale (anche se lo si fa dopo aver inviato la richiesta pull).

Ecco perché è necessario a rebase invece di fondere:

git co devel #devel is ansible's HEAD aka "master" branch 
git pull --rebase upstream devel 
git co user-non-unique 
git rebase devel 

Sia l'opzione rebase e comando per git rebase non mancherà di tenere il vostro albero pulito, ed evitare di dover unire commit. Ma tieni a mente che quelli sono i tuoi primi commit (con i quali hai lanciato la tua prima richiesta di pull) che sono stati ridefiniti, e che ora hanno un nuovo hash di commit, che è diverso dagli hash originali che sono ancora nel tuo ramo di repository remoto github .

Ora, l'invio di questi aggiornamenti al proprio ramo di funzione Github fallirà qui, poiché entrambe le diramazioni differiscono: l'albero di diramazione locale e l'albero di diramazione remoto sono "fuori sincrono", a causa di questi diversi hash di commit. Git ti dirà di prima git pull --rebase, poi spingerò di nuovo, ma questa non sarà una semplice spinta veloce, dato che la tua storia è stata riscritta. Non farlo!

Il problema qui è che si sarebbe ancora una volta prendere il vostro primo commit cambiato come erano in origine, e quelli otterrà fusa in cima alla vostra filiale locale. A causa dello stato non sincronizzato, questa attrazione non si applica in modo pulito. Riceverai una cronologia originale in cui i tuoi commit vengono visualizzati due volte. Quando si invierà tutto questo al proprio ramo di funzione github, tali modifiche si rifletteranno sulla richiesta di pull originale, che diventerà molto, molto brutta.

AFAIK, in realtà non esiste una soluzione totalmente pulita.La soluzione migliore che ho trovato è quello di forzare spingere la vostra filiale locale per la filiale github (in realtà costringendo un aggiornamento non-fast-ORIZZONTE):

Come per git-push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository. 

Così don 't tirare, proprio forza di spinta in questo modo:

git push svg +user-non-unique 

o:

git push svg user-non-unique --force 

questo effettivamente chiaramente overwrit e la tua filiale remota, con tutto nella tua filiale locale. I commit che si trovano nello stream remoto (e hanno causato l'errore) rimarranno lì, ma saranno commit penzolanti, che alla fine verranno eliminati da git-gc (1). Nessun grosso problema.

Come ho già detto, questo è AFAICS la soluzione più pulita. Il rovescio della medaglia è che il tuo PR sarà aggiornato con i nuovi commit, che avranno una data successiva, e potrebbero apparire fuori sincrono nella cronologia dei commenti del PR. Nessun grosso problema, ma potrebbe potenzialmente essere fonte di confusione.

Problemi correlati