Contribuire al progetto su GitHub, come "ribasare la mia richiesta pull in cima al master"


98

Ok, quindi contribuisco a un progetto su GitHub. Il progetto su GitHub è upstream, il mio repository forkato su GitHub è origine il mio localrepository sul mio computer.

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

quindi invio una richiesta pull

git push origin master

La richiesta pull viene esaminata e deve essere apportata una modifica non correlata. Qualcun altro fa un commit e si fonde conupstream/master

Ora mi viene chiesto dal upstreammanutentore di "ribasare la mia richiesta pull in cima al master"

Questa è la mia storia (inserire l'effetto sonoro di Law and Order) .....

Non ho apportato alcuna modifica alla richiesta pull ed è sempre la stessa funzione di commit sul ramo.

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

Non capisco. Com'è possibile quando so che qualcuno si è impegnato e si è unito a upstream/masterdopo aver inviato la mia richiesta pull a origin/feature?

Qualcuno può dirmi quale dovrebbe essere la procedura corretta in questa situazione?

Risposte:


109

Mostra solo un recupero nel repository upstream. Questo in realtà non aggiorna nessuno dei tuoi rami locali. Si aggiorna solo la vostra conoscenza diupstream . Dovresti assicurarti che upstream/mastersia completamente fuso nel tuo master, come con a git pull, prima del rebase su master, o più semplicemente semplicemente rebase su upstream/master.

Cioè:

git checkout master
git pull upstream master
git checkout feature
git rebase master

o

git checkout feature
git rebase upstream/master

Aggiornare:

Dopo aver corretto il featureramo locale , dovrai reinserirlo originper completare l'aggiornamento della richiesta pull. Dato che hai già spinto featureuna volta, non puoi semplicemente di pushnuovo perché un rebase cambia la cronologia e non è lungo un avanzamento veloce. Normalmente, quando un push fallisce con un "non-fast-forward", lo risolveresti facendo un pull, ma un pull combinerà semplicemente le due storie divergenti, che sicuramente non è quello che vuoi. Ciò significherebbe che il tuo vecchio featureramo (pre rebase) sarebbe combinato con quello nuovo (post rebase). Vuoi sovrascrivere origin/feature con lo stato del nuovo featureramo, scaricando qualsiasi record di quello vecchio. Ciò significa che dovrai forzare la spinta ad avvenire, anche se non è un avanzamento veloce, usando git push -f origin feature. Nota:pericoloso e puoi perdere i commit con esso. Usalo solo se sei assolutamente sicuro di sapere cosa stai facendo, come proprio qui, dove vuoi intenzionalmente eliminare i vecchi commit inutili nel featureramo pre-rebase .


1
Ok, vedo, grazie per il chiarimento. Vedo che avrei dovuto tirare invece che recuperare. Ora ho un altro problema, quando git push origin featurericevo un errore di non avanzamento rapido, non riesco a eseguire il push, ecc. Git pull --rebase risolverà questo errore e invierà il push al mio ramo delle funzionalità o ciò causerebbe problemi al manutentore e ad altri?
fontno

1
Ho aggiornato la mia risposta per coprire la spinta.
Ryan Stewart,

Nel mio caso, ho aggiunto il repository upstream come telecomando, ma ho dimenticato di recuperarlo. git fetch upstreamscaricato le ultime modifiche, poi alla fine ha git rebase upstream/developfunzionato.
Alberto Chiusole

9

Ora mi viene chiesto dal manutentore a monte di "ribasare la mia richiesta pull sopra il master"

Nota che da settembre 2016, il manutentore può attivare il rebase da solo.

Vedi " Rebase e unisci richieste pull "

Quando selezioni la nuova opzione "Rebase and merge", i commit dal ramo della richiesta pull vengono ribasati sulla punta del ramo di base, e quindi il ramo di base stesso viene rapidamente inoltrato a questa testa appena ribasata. I rebase impostano automaticamente il committer dei commit ribassati all'utente corrente, mantenendo intatte le informazioni sull'autore. Il ramo della richiesta pull non verrà modificato da questa operazione.

Se non è possibile eseguire un rebase a causa di conflitti, ti faremo sapere in modo che tu possa risolverli manualmente se necessario.

https://cloud.githubusercontent.com/assets/2195/18671961/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif

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.