2009-09-25 5 views
9

Ho provato a spingere la mia (prima in assoluto!) Git repo come questo inizialmente:Perché "git push helloworld + master: master" invece di "git push helloworld"?

$ git push helloworld 

ma ho ottenuto questo ritorno:

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

Così ho trovato another StackOverflow question di "commit modificati" e ha cercato un suggerimento da lì senza sapere veramente se mi avrebbe aiutato:

[email protected] /c/test/helloworld (master) 
$ git push helloworld +master:master 

Ha funzionato!

Ma io non so perché risolto il mio problema :(

Qualcuno potrebbe spiegare perché questo funziona, ma "git push helloworld" non lo fa?

+1

Aggiunta un'altra soluzione, in risposta al tuo commento. – VonC

risposta

18

Sembra aver riscritto la vostra storia (SHA-1 associato con i tuoi commit) nel branch master

Ciò significa, non è più possibile spingere in una modalità fast-forward

maestri forze + la spinta a prendere posto:..
By avendo il comando opzionale +, puoi dire a git di aggiornare il ref <dst> anche quando l'aggiornamento non è un avanzamento veloce.

Nota: questo potrebbe essere negativo se qualcun altro ha già clonato il repository, dal momento che non sarà più in grado di estrarre il ramo principale senza alcun conflitto.
Vedere anche questo SO answer for more.


Nota: come accennato by Junio C. Hamano:

Ci sono due meccanismi di sicurezza indipendenti:

  • sicurezza all'estremità di invio può essere sovrascritta "git push --force" e/o utilizzando un refspec preceduto da un prefisso "+");

  • la sicurezza di ricezione può essere sostituita dalla variabile di configurazione receive.denynonfastworwards del repository in cui si sta spingendo.

Quest'ultimo default "non sicuro", ma se la sicurezza è attivato nel repository, costringendo dal lato di invio non disattivarla. IOW, entrambe le estremità devono essere d'accordo per consentire il comportamento non sicuro.


Come menzionato nella Git FAQ, una possibile linea d'azione è:

La ragione più probabile di questo è che è necessario tirare dal telecomando prima. Puoi vedere quali modifiche ha il lato remoto recuperando prima e poi controllando il registro.Ad esempio,

$ git fetch origin 
$ git log master..origin/master 

elencherà tutti i cambiamenti dal lato remoto ha che il vostro lato non lo fa.
Se si desidera una rappresentazione grafica, utilizzare gitk --left-right master...origin/master.
Le frecce a sinistra sono le modifiche che si desidera premere, le frecce a destra sono le modifiche sul lato remoto.

Altro soluzione (che è quello che hai fatto):

$ git push origin +branchname 

Questo costringerà l'aggiornamento. Se non si dispone dell'autorizzazione, poi a volte questo lavoro:

$ git push origin :branchname 
$ git push origin +branchname 

cioè, eliminare il ramo remoto prima (questo è spesso consentita), poi ri-spingere il "nuovo" (o forse riavvolto) ramo.

Attenzione, se si riavvolgono i rami, altri potrebbero entrare in difficoltà durante la trazione.
C'è la possibilità che si uniscano nel ramo che hanno recuperato con quello nuovo che hai pubblicato, mantenendo effettivamente le modifiche che stai cercando di eliminare.
Tuttavia, saranno le loro copie ad avere le brutte revisioni. Per questo motivo, i rami di riavvolgimento sono considerati leggermente antisociali. Tuttavia, è spesso appropriato.

+0

Questo è un repository git privato solo per imparare le corde - quindi non sono preoccupato per i conflitti con gli altri. Quello che mi piacerebbe fare è eliminare questo repository e farlo correttamente la prossima volta. Cosa avrei dovuto fare invece di "+ master: master" dopo aver ricevuto il messaggio "[rifiutato]"? –

+0

E 'stato. Grazie mille! L'ho rifatto da zero, ma questa volta ho fatto prima un tiro e ha funzionato. Che strana stranezza! In Mercurial non ho mai dovuto fare qualcosa di simile quando sto creando un nuovo progetto. –

+0

hg push ha una bandiera di forza per lo stesso motivo. Se cambi la cronologia (tramite mq o qualsiasi altra cosa), dovrai forzare quella spinta. – Dustin