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