2015-11-01 4 views
18

Mi è stato la creazione di un nuovo repository su GitHub e stava cercando di spingere per esso, ma Git mi ha tenuto dando un errore che dice:Perché Git vuole che prenda prima di spingere?

error: failed to push some refs to...

Alla fine ho provato tirando prima e poi spingere e che ha funzionato. Ma perché?

+0

Poiché qualcuno ha già inviato alcuni nuovi commit al repository remoto. Ora git presume che tu debba recuperare le nuove modifiche, unirle con le tue modifiche e poi spingere indietro le modifiche risultanti – user3159253

risposta

29

Hai menzionato che stavi creando un nuovo repository.

Mentre la risposta e i commenti sono anche veri, è probabile che tu sia l'unica persona che interagisce con il repository. Ti è stato richiesto di prelevare perché hai inizializzato il repository con un README su GitHub (this is likely the tutorial you followed).

Se non è stato inizializzato il repository con un README, ovvero GitHub non ha eseguito un primo commit di "README.md", si avrebbe un repository completamente vuoto a cui è possibile inviare direttamente.

Il motivo per cui GitHub ha l'opzione è più probabile per assistere gli utenti che stanno iniziando un nuovo progetto (come te) per ottenere molto facilmente andare dopo la creazione di un repository su GitHub effettuando un pull/clone e avere quell'inizializzazione iniziale, che consente di aggiungere rapidamente nuovi file e spingere.

Inoltre, inizializzando un repository con un README, avrete un ramo maestro pronto a clonare e iniziare a monitorare i file. Mentre su un repository completamente vuoto di ricevere notifiche da Git come:

warning: You appear to have cloned an empty repository. 

senza inizializzare, sarà anche poi devono spingere la vostra prima commette la prima volta in modo esplicito a padroneggiare con git push origin master, come Git sarà gentilmente dire si:

No refs in common and none specified; doing nothing. 
Perhaps you should specify a branch such as 'master'. 
Everything up-to-date 

Per riassumere, era che prima di impegnarsi (vedi i tuoi commit e vedrete la prima README commit) che vi ha impedito di spingere senza tirare come loc Il repository al non è sincronizzato con il repository su GitHub.

+1

Sarebbe possibile per lui riscrivere la cronologia per cancellare quel file readme e quindi non doverla tirare? – boot4life

+0

@ boot4life bene, più come 'sovrascrivere' di riscrivere, supponendo che uno non ha tirato e il file readme è solo su remoto (i.e GitHub) quindi si può forzare la spinta, vedere http://stackoverflow.com/a/12610763/4512948 ma vedere anche ** perché questo non va bene se stai collaborando **: https: //developer.atlassian. com/blog/2015/04/force-with-lease/ ** TL; DR ** praticamente ignori qualsiasi cosa ci sia e sovrascrivi tutto con quello che hai, il che va bene se sai per certo che non c'è tutto ciò che vuoi lì. Altrimenti stai cambiando la storia per tutti. – matrixanomaly

6

Ecco perché eventuali modifiche parallele apportate da qualcun altro e quindi archiviate vengono inserite nell'ambiente di sviluppo per l'unione e il test. In questo modo, il numero di modifiche parallele non integrate viene mantenuto a un minimo gestibile

3

Nel tuo caso, GitHub ha creato automaticamente il primo commit (spesso file README.md e LICENCE) e per poter inviare i tuoi commit, devi prima tirare (recuperare e unire) il commit di GitHub.

2

Quando si tira, Git recupera i commit all'origine e proverà a far avanzare rapidamente i commit locali su di essi, facendo l'unione. Dopodiché puoi spingere in questo modo e non genererai conflitti con altri aggiornamenti.

+2

Pull fa unire: non è un avanzamento veloce. L'avanzamento veloce è ciò che accade quando si preme. – bdsl