Come unire le modifiche remote su GitHub?


137

Ricevo il seguente errore, quando provo la prima spinta di Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

come posso risolvere questo problema e unire le modifiche remote?

Risposte:


106

Vedi la sezione 'avanzamento non veloce' di ' git push --help ' per i dettagli.

È possibile eseguire "git pull", risolvere potenziali conflitti e "git push" il risultato. Un "git pull" creerà un commit di fusione C tra i commit A e B.

In alternativa, puoi modificare la modifica tra X e B sopra A, con "git pull --rebase" e respingere il risultato. Il rebase creerà un nuovo commit D che costruisce il cambiamento tra X e B sopra A.


16
Continuo a imbattermi in questo, tranne che se faccio un "git pull" mi viene detto "Già aggiornato". e se faccio un "git pull --rebase" mi viene detto che "Il direttore di filiale attuale è aggiornato". Qualche idea? Grazie!
jwl,

3
@ larson4 Ho avuto lo stesso problema, ma dopo aver fatto il git pull, fai un altro commit e poi dovrebbe andare bene
Patrick

20
@Patrick @larson Ho avuto un problema simile a causa del fatto che non avevo letto attentamente il messaggio di errore. Il rifiuto era su un ramo che non avevo verificato. Il ramo in cui mi trovavo effettivamente stava funzionando. La soluzione era git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier,

86

Puoi anche forzare un push aggiungendo il simbolo + prima del nome del tuo ramo.

git push origin +some_branch

1
Grazie, questo funziona per me. Le altre soluzioni cancellerebbero completamente il mio effettogit reset --hard
Oli,

1
Grazie! Avevo spinto il ramo "A" fino alla mia app di gestione temporanea Heroku per testare alcune funzionalità in un ambiente di produzione. Quindi (localmente) ho unito "A" e "B" in "master" e volevo inserire "master" nella mia app di staging. Stava avendo tutti i tipi di problemi. Ciò ha reso molto semplice la spinta al "maestro". Grazie!
Don Leatham,

Ha funzionato anche per me. Mi ci sono voluti 4 ore per trovare il problema. Molte grazie. Eseguo Netbeans su una macchina locale (Windows 7) e volevo su ogni push su locale, controlla su una macchina remota (Linux).
Maxim Shoustin,

Si noti che questo metodo potrebbe non essere sicuro e può rendere irraggiungibili alcuni commit divergenti.
samuil,

Questa dovrebbe essere la soluzione accettata. Le altre soluzioni non funzionavano per me
banarun l'

20

Probabilmente hai delle modifiche su Github che non hai mai unito. Prova git pulla recuperare e unire le modifiche, quindi dovresti essere in grado di eseguire il push. Scusa se ho frainteso la tua domanda.


18
Nel caso in cui sia necessario rifiutare le modifiche nel master remoto e inviare le proprie modifiche, provare a premere con il tasto -f
Hotsyk

13

Se si "git pull" e dice "Già aggiornato", e si ottiene ancora questo errore, potrebbe essere perché uno degli altri rami non è aggiornato. Prova a passare a un altro ramo e assicurati che anche uno sia aggiornato prima di provare a "git push" di nuovo:

Passa al ramo "pippo" e aggiornalo:

$ git checkout foo
$ git pull

Puoi vedere i rami che hai emettendo il comando:

$ git branch

Puoi spiegare perché questo funziona ed è necessario? (Ha risolto il mio problema.) Mi sembra poco intuitivo. Non capisco perché git avrebbe bisogno di un altro ramo per essere aggiornato e per me per spingere il ramo principale.
Quinxy von Besiex,

@QuinxyvonBesiex Non sono sicuro di aver capito bene. Potrebbe avere qualcosa a che fare con la struttura sottostante di Git stesso, e come organizza i rami (che sono sostanzialmente gli stessi dei tag per quanto ne capisco).
David Calhoun,

7

Puoi forzarlo a spingere, ma per favore fallo SOLO quando sei abbastanza sicuro di quello che stai facendo.

Il comando è:

git push -f 

3

Questo problema può verificarsi anche in presenza di tag in conflitto. Se la versione locale e la versione remota utilizzano lo stesso nome tag per commit diversi, puoi finire qui.

Puoi risolverlo eliminando il tag locale:

$ git tag --delete foo_tag

2

Quando ho riscontrato questo errore, ho eseguito il backup dell'intera cartella del mio progetto. Poi ho fatto qualcosa di simile

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... a seconda del nome della tua filiale (se non è master).

Poi l'ho fatto git pull --rebase. Successivamente, ho sostituito i file estratti con i file del mio progetto di backup. Ora sono pronto per eseguire nuovamente il commit delle modifiche e spingere.


0

1) Forzare un pull per sovrascrivere le modifiche locali

Se non ti interessano le modifiche apportate localmente e desideri ottenere il codice dal repository, puoi forzare un pull. Questo sovrascriverà tutte le modifiche locali fatte sul tuo computer apparirà una copia duplicata della versione nel repository.

Esegui i seguenti comandi nel tuo IDE:

git reset - difficile

git pull

Ciò distruggerà istantaneamente tutte le modifiche locali, quindi assicurati di sapere cosa stai facendo e di non aver bisogno delle modifiche locali.

2) Mantenimento di entrambe le modifiche (locale e dal repository)

Se si desidera conservare entrambe le modifiche (modifiche apportate localmente e modifiche presenti nel repository), è possibile aggiungere e confermare le modifiche. Quando tiri, ci sarà ovviamente un conflitto di unione. Qui puoi usare gli strumenti nel tuo IDE (come Difftool e mergetool) per confrontare i due pezzi di codice e determinare quali modifiche mantenere e quali rimuovere. Questa è la via di mezzo; nessuna modifica andrà persa fino alla loro rimozione manuale.

git aggiungi $ the_file_under_error

git commit

git pull
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.