2015-02-10 21 views
41

C'è un buon modo per spiegare come risolvere "! [rejected] master -> master (fetch first)'" in Git?! [respinto] master -> master (preleva per primo)

Quando si utilizza questo comando $ git push origin master viene visualizzato un messaggio di errore.

! [rejected]  master -> master (fetch first) 
error: failed to push some refs to '[email protected]:zapnaa/abcappp.git' 
+0

stesso problema: D – core114

risposta

50

La risposta è lì, git ti sta dicendo di recuperare prima.

Probabilmente qualcun altro ha già spinto a padroneggiare e il tuo impegno è dietro. Quindi devi recuperare, unire il changeset, e poi sarai in grado di spingere di nuovo.

Se non lo si (o, peggio ancora, se lo si forza usando l'opzione --force), è possibile modificare la cronologia del commit.

EDIT: approfondisco l'ultimo punto, dato che un ragazzo qui ha dato il consiglio molto cattivo di usare l'opzione --force.

Poichè git è un DVCS, idealmente molti altri sviluppatori stanno lavorando sullo stesso progetto come voi, usando lo stesso repository (o un fork di esso). Se si sovrascrive forzatamente con il changeset, il repository non corrisponderà a quello degli altri, perché "hai riscritto la cronologia". Renderai le altre persone infelici e il deposito ne risentirà. Probabilmente anche un gattino al mondo piangerà.

TL; DR

  1. Se si vuole risolvere, prendere prima (e quindi unire).
  2. Se si desidera hackerare, utilizzare l'opzione --force.

Hai chiesto il primo, però. Vai per 1) sempre, anche se userai sempre git da solo, perché è una buona pratica.

+0

Non può andare a prendere eliminare importanti cambiamenti nel file locali? –

+0

Non cambia dopo un recupero – dhein

+0

@dhein come ho scritto, il recupero deve essere seguito da un'unione - il punto è che devi "allineare" l'albero locale con l'albero remoto (quindi con l'unione) - ma grazie, l'ho scritto nel TL; DR anche – linuxbandit

3

Prova questo comando git

git push origin master --force 

o corto di forza -f

git push origin master -f

+0

Grazie @ user1865618, git push origin master --force. questo comando mi ha salvato il tempo –

+0

È divertente leggere questo, dopo aver letto altre risposte dicendo: 'Non farlo, a meno che tu non sappia cosa stai facendo'. :-) – Zeth

+0

Questo ignora la restrizione push git. Non raccomandato per il lavoro di squadra.Dalla documentazione push di git: _Se qualcun altro ha costruito sopra la tua cronologia originale mentre stai ridiventando, la punta del ramo sul telecomando potrebbe avanzare con il suo commit, e spingendo ciecamente con --force farà ** perdere il suo lavoro **. – Casey

16

Si dovrebbe usare git pull, thats comando fare un git fetch e successiva fare il git merge.

Se si utilizza un comando git push origin master --force, è possibile che si verifichino problemi in futuro.

+0

E 'corretto che tu debba usare --force se sei l'unico sul progetto e ti stai frustrando cercando di fare la tua prima spinta? – Chrips

6

pull è sempre l'approccio corretto ma potrebbe esserci un'eccezione quando si tenta di convertire un file system Git none in un repository Github. Dovresti forzare il primo commit in.

git init 
git add README.md 
git add . 
git commit -m "first commit" 
git remote add origin https://github.com/userName/repoName.git 
git push --force origin master 
+0

funziona per me, ho ricominciato un nuovo progetto (stesso repository) e volevo sostituirlo. – ucotta

15

prova:

git fetch origin master 
git merge origin master 

Dopo di scritto questo codice ho ricevuto altro errore: (non-fast-forward)

scrivo questo codice:

git fetch origin master:tmp 
git rebase tmp 
git push origin HEAD:master 
git branch -D tmp 

E risolto il mio problema

+0

Lo stesso per me. Questo ha risolto il mio problema. Ci sono un paio di avvertimenti. Ho incasinato un sub-repository, ma l'ho risolto con questo: http://stackoverflow.com/questions/19584255/what-does-a-grey-icon-in-remote-github-mean –

+0

Grazie sta funzionando per me – core114

0

E ' è probabile che qualcun altro (ad es. il tuo collega) ha inserito il commit su origin/master che non si trova nel tuo ramo locale master e stai provando a inviare alcuni commit dal tuo ramo locale al server. Nel 99% dei casi, supponendo che non si voglia cancellare il proprio lavoro da origin, si hanno due opzioni:

2) Unire le modifiche nel ramo locale e quindi premere il risultato unito. git checkout master git pull # resolve conflicts here git push

(Si noti che git pull è essenzialmente solo un git fetch e un git merge in questo caso.)

1) REBASE la filiale locale, in modo che sembra che il suo collega hanno presentato le loro commit prima, e poi hai fatto la tua impegna. Ciò mantiene la cronologia del commit piacevole e lineare ed evita un "merge commit". Tuttavia, in caso di conflitti con le modifiche del collega, potrebbe essere necessario risolvere tali conflitti per ciascuno dei tuoi commit (anziché solo una volta) nel peggiore dei casi. Essenzialmente questo è più bello per tutti gli altri, ma uno sforzo maggiore per te. git pull --rebase # resolve conflicts here git push

(Si noti che git pull --rebase è essenzialmente una git fetch e git rebase origin/master.)

0

a volte succede quando si duplica file README tipicamente sorta di.

0

È possibile utilizzare il seguente comando: primo clone una nuova copia del pronti contro termine, utilizzando il flag --mirror:

$ git clone --mirror git://example.com/some-big-repo.git 

Poi seguono i codici di conseguenza:

Adding an existing project to GitHub using the command line

Anche se ciò non funziona, puoi semplicemente scrivere il codice:

$ git push origin master --force 

o

$ git push origin master -f