2012-03-23 12 views
54

So che le persone hanno fatto domande simili, ma credo che le cause dei loro problemi siano diverse. Ho fatto un hard reset perché avevo incasinato il mio codice piuttosto malegit push respinto: errore: impossibile inviare alcuni riferimenti

git reset --hard 41651df8fc9 

ho fatto abbastanza alcuni cambiamenti, ho fatto alcuni commit e ora che sto cercando di spingere tutti questi commit nel server ottengo il seguente errore:

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

Git suggerisce di fare un pull git e questo è quello che gli altri hanno suggerito ad altri utenti. Tuttavia, credo che un git pull unirà il mio codice attuale con il codice che non voglio più (revisione della testa). Come posso fare una spinta e dimenticare la versione/revisioni prima di me?

risposta

90

git push -f se si dispone dell'autorizzazione, ma questo rovinerà chiunque altro che preleva da tale repo, quindi fate attenzione.

Se questo è negato, e si ha accesso al server, come canzar dice qui di seguito, si può permettere questo sul server con

git config receive.denyNonFastForwards false 
+0

Credo che non ho il permesso 'a distanza : errore: negare i ref non/fast-forward/heads/master (dovresti tirare prima) "Sono l'unico che lavora su questo repo al momento, quindi non sono preoccupato per nessun altro ramo o altro. Qualche idea? – Eric

+0

Se sei il solo proprietario di questo repo, usa semplicemente 'git push -f', che userà il repository corrente per sostituire quello remoto. Se ci sono sviluppi per più utenti, il forward-forward è essenziale, altrimenti, sarà molto facile che accadano fastidi. – Tim

+1

Se è possibile accedere al telecomando, è possibile andare direttamente nel repository git nudo e riavvolgere manualmente il ramo, con 'git branch -f', ad es.' Git branch -f rewind_the_one_I_broke 8120307' ad esempio. È possibile eseguire 'git log' in un repository nudo per trovare il punto di reset. Nota che questo ha lo stesso effetto di un 'git push -f' ma ignora i ganci. – torek

23

Se sei l'unica persona che lavora al progetto, cosa si può fare è:

git checkout master 
git push origin +HEAD 

Questo imposterà la punta di origine/master per lo stesso impegnarsi come master (e quindi eliminare i commit tra 41651df e l'origine/master)

+0

si eliminerà il codice che non desidero più e manterrò il mio nuovo codice? (scusa se è una risposta stupida) – Eric

+2

questo imposterà la punta di origine/master allo stesso commit di master (e quindi cancella i commit tra 41651df e origine/master) – ouah

+0

Aggiorna il ramo master del repository di origine con il tuo attuale HEAD ramo, consentendo aggiornamenti non rapidi. Quindi, questo è lo stesso con 'git push HEAD -f'. Per me, penso, puoi usare un modo più gentile per farlo, prima usa 'git fetch', dopodiché usa 'git rebase -i origine/master', questo ti permetterà di selezionare i commit. – Tim

4

'remote: error: denying non-fast-forward refs/heads/master (you should pull first)'

Quel messaggio suggerisce che c'è un hook sul server che rifiuta i push di avanzamento veloce. Sì, di solito non è raccomandato ed è una buona guardia, ma dal momento che sei l'unica persona che lo usa e vuoi fare il push force, contatta l'amministratore del repository per consentire di eseguire la spinta non rapida rimuovendo temporaneamente il agganciare o darti il ​​permesso nel gancio per farlo.

+1

Oppure, l'amministratore ha eseguito 'git branch -f', che ha lo stesso effetto ma non richiede agitazione con il gancio di pre-ricezione. – torek

10

Basta fare

git pull origin [branch] 

e poi si dovrebbe essere in grado di spingere.

Se si dispone di commit da soli e non spinta al ramo ancora, cercare

git pull --rebase origin [branch] 

e allora si dovrebbe essere in grado di spingere.

0

Quello che ho fatto per risolvere il problema era:

git pull origin [branch] 
git push origin [branch] 

Assicurarsi inoltre che si punta per il ramo di destra eseguendo:

git remote set-url origin [url]