2009-03-06 7 views
45

Mi arrendo! ogni volta che provo a spingere ottengo uno stupido:git push respinto

! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '[email protected]:companyX/projectX.git' 

La nostra squadra ha una nuova configurazione git. Invece di creare filiali private ora ho biforcato il nostro repository principale (su github) per creare la mia copia personale.

Ad un certo punto quello che ho fatto è stato:

$ git fetch upstream master:upstreammaster 

Così qui è la mia messa a punto corrente ::

$ git branch 
master 
* upstreammaster 

$ git remote -v 
origin [email protected]:userX/projectX.git 
upstream [email protected]:companyX/projectX.git 

dove userX è il mio repository privato.

Così vado a fare alcune modifiche al mio ramo upstreammaster, e il PULL da "upstream master". Tutto si fonde e roba del genere:

$ git pull upstream master 
remote: Counting objects: 95, done. 
remote: Compressing objects: 100% (60/60), done. 
remote: Total 60 (delta 54), reused 0 (delta 0) 
Unpacking objects: 100% (60/60), done. 
From [email protected]:companyX/projectX 
* branch   master  -> FETCH_HEAD 
Merge made by recursive. 
stuff      | 165 ++++++++++++-------- 
stuff      | 35 ++-- 
stuff      | 107 ++++++++++--- 
stuff      | 105 ++++++++++--- 
stuff    | 24 ++-- 
stuff    | 9 +- 
stuff     | 53 +++---- 
stuff   | 44 +++--- 
stuff    | 52 +++---- 
stuff | 32 +---- 
stuff   | 4 +- 
stuff    | 138 ++++++++--------- 
stuff  | 58 ++++---- 
stuff | 115 ++++++++------ 
stuff   | 5 +- 
stuff      | 39 ++--- 
stuff      | 28 ++-- 
17 files changed, 560 insertions(+), 453 deletions(-) 

ma poi quando cerco di fare:

$ git push upstream master 
To [email protected]:companyX/projectX.git 
! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '[email protected]:companyX/projectX.git' 

qualsiasi aiuto sarebbe greately apprezzato! Se hai bisogno di chiarimenti per favore chiedi, ti risponderò!

+0

@drozzy: Sapete perché Git non accetta il vostro comando? Il tuo comando ha funzionato una volta per me. Dopo aver spostato Git in un'altra cartella del mio Mac, ricevo un messaggio di errore simile. –

+0

no scusa non lo so. In questo momento faccio principalmente "git push upstream master", dopo aver unito il mio altro ramo a upstreammaster. – drozzy

+0

Vedere anche [Gli aggiornamenti non-fast forward di Git push sono stati rifiutati] (http://stackoverflow.com/questions/4684352/whats-a-fast-forward-in-git). –

risposta

20

Quando si effettua una spinta, provare a specificare il refspec per il master a monte:

git push upstream upstreammaster:master 
+1

Questo funziona per qualche motivo ... – drozzy

+3

@Jarret: Non funziona per me. Il mio codice $ git push [email protected]: user/repo.git [email protected]: user/repo.git: master. –

+0

Masi, prova senza utilizzare l'URL completo sul secondo parametro: git push [email protected]: utente/repo.git master –

13

In primo luogo, il tentativo di tirare dallo stesso refspec che si sta tentando di spingere a.

Se ciò non funziona, è possibile forzare un git push utilizzando git push -f <repo> <refspec>, ma prestare attenzione: questo metodo può causare l'eliminazione di riferimenti nel repository remoto.

16

Jarret Hardie è corretto. In alternativa, prima converti le modifiche in master e quindi prova la spinta. Per impostazione predefinita, git push inserisce tutti i rami con nomi corrispondenti sul telecomando e nessun altro. Quindi quelle sono le tue due scelte - o specificarlo esplicitamente come Jarret ha detto o fondersi in un ramo comune e poi spingere.

Si è parlato di questo nella mailing list Git ed è chiaro che questo comportamento non cambierà molto presto - molti sviluppatori si affidano a questo comportamento nei loro flussi di lavoro.

Modifica/Chiarimento

Assumendo che il ramo upstreammaster è pronto a spingere allora si potrebbe fare questo:

  1. Pull a eventuali modifiche del monte.

    $ git pull maestro monte

  2. Passa al mio ramo principale locale

    $ git checkout maestro

  3. unire le modifiche in da upstreammaster

    $ git merge upstreammaster

  4. Push my changes up

    $ git push monte

Un'altra cosa che si può vuoi fare prima di spingere è di rebase contro le modifiche a monte/master in modo che i commit sono tutti insieme. Puoi farlo come passaggio separato tra il 1 ° e il 2 ° posto (git rebase upstream/master) o puoi farlo come parte del tuo pull (git pull --rebase upstream master)

+0

Come intendi "unire di nuovo a un ramo comune e quindi premere"? Qual è il ramo comune in questo caso? – drozzy

+0

Ho avuto lo stesso problema dopo aver controllato e lavorato su un ramo, e ho spinto le modifiche che includevano un aggiornamento in un file che era stato eliminato nel ramo principale (che non avevo affatto toccato). Un altro sviluppatore ha provato alcuni comandi Git che non ho catturato, ma il problema è rimasto: 'git status' ha mostrato che il mio ramo era pulito,' git pull' non ha fatto nulla, ma il comando 'git push' restituisce ancora' errore: non è riuscito a spingere alcuni riferimenti ... '. Alla fine ho risolto il problema in questo modo: 1. 'git checkout master', 2.' git pull', e 3. 'git checkout the_branch_name'. –

+0

ehm ... beh, e cosa succede quando esegui il primo comando (git pull upstream master) e hai un conflitto nel pull ??? Devi risolvere il conflitto prima di andare avanti ?? –

3

Il tuo repository è "a monte" un repository spoglio? Ho avuto lo stesso errore, ma quando cambio a nudo non succedono più.

+0

fantastico, questo è esattamente ciò che stava causando il mio problema, grazie per la risposta! – adamc