2012-08-06 4 views
5

Qualcuno può fornire un semplice esempio di cosa potrebbe causare il fallimento di un push Git su un repository centrale perché non può verificarsi un avanzamento veloce? Quale dovrebbe essere il repository locale rispetto allo stato del repository centrale in modo che questo avvenga? Davvero avendo problemi a visualizzare questo ...Cosa significa che una spinta Git non può essere fusa rapidamente?

+0

Ottima domanda! Molte persone non lo capiscono, ma la maggior parte delle domande che ho trovato non sono scritte bene. – erikbwork

risposta

11

suppongo che voi state vedendo questo problema:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/mayoff/t/test/central' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Ecco come gli “aggiornamenti non-fast-forward sono state respinte” problema accade.

Diciamo che Alice e Bob stanno lavorando a un progetto. Ognuno di loro ha un repository, e c'è un repository centrale che entrambi spingono e tirano da. Inizialmente, i tre repository simile a questa:

initial synchronized repos

Ora Alice e Bob sia fare un certo lavoro. Ogni commette un cambiamento diverso per il loro repository locale:

private repos have new commits

Avanti, Alice spinge il suo cambiamento al repository centrale:

central repo updated by Alice

Avanti, Bob cerca di spingere. Il ramo master del repository centrale punta a commit 3. Il push di Bob tenta di aggiornarlo per puntare su commit 4. Poiché commit 4 non ha commit 3 come antenato, è necessaria un'unione, ma git push non esegue reali fusioni. Fa solo "fast-forward", dove il nuovo maestro ha il vecchio maestro come antenato. Quindi Bob riceve l'errore perché sta cercando di spingere qualcosa che richiede una vera unione, non un avanzamento rapido.

Per spingere con successo, Bob deve prendere prima il nuovo commit dalla repo centrale:

Bob has fetched Alice's commit

e deve unire le sue modifiche (commit # 4) con i cambiamenti di Alice (commettono # 3) , creando un nuovo commit che ha sia impegna come antenati:

Bob has merged the commits

fetch e merge può essere fatto in due comandi (git fetch seguite da git merge) o in un comando (git pull).

Ora Bob può spingere con successo, perché il repository centrale rileva che il nuovo master ha il vecchio master come antenato.

Bob pushed the merge

noti che ora Alice manca commit di Bob. Se si impegna di più sul suo repository e cerca di spingere prima di prelevare dal repository centrale, otterrà l'errore di non avanzamento veloce, e lei dovrà recuperare e unirsi per risolverlo, proprio come ha fatto Bob.

+0

Ho appena realizzato che tutte le mie frecce indicano la direzione sbagliata. Oh bene.Spero sia abbastanza chiaro. –

+0

Bene, ora mostrano lo sviluppo nel tempo e non l'albero del git. Anche questo non è male. – erikbwork

+0

consistenza è la chiave. e indicando la direzione del tempo che avanza potrebbe effettivamente essere più comodo per alcune persone. – araqnid

0

Basta fare un commit sul repository centrale sullo stesso ramo senza tirare a quello locale. Quindi esegui il commit localmente e prova a spingere.

Problemi correlati