Stai vedendo una funzione di sicurezza Git. Git si rifiuta di aggiornare il ramo remoto con il proprio ramo, poiché il commit principale del proprio ramo non è un diretto discendente dell'attuale head commit del ramo verso cui si sta spingendo.
Se così non fosse, allora due persone che spingono nello stesso repository nello stesso momento non saprebbero che ci sarebbe stato un nuovo commit in arrivo allo stesso tempo e chiunque avesse spinto per ultimo avrebbe perso il lavoro del precedente spintore senza nessuno dei due realizzando questo.
Se sai di essere l'unica persona che spinge e desideri inviare un commit modificato o inviare un commit che riavvolge il ramo, puoi "forzare" Git ad aggiornare il ramo remoto usando l' -f
interruttore.
git push -f origin master
Anche questo potrebbe non funzionare poiché Git consente ai repository remoti di rifiutare spinte non veloci dall'altra parte usando la variabile di configurazione receive.denynonfastforwards
. In questo caso, il motivo del rifiuto sarà simile al seguente (notare la parte "rifiutato a distanza"):
! [remote rejected] master -> master (non-fast forward)
Per ovviare a questo, è necessario modificare la configurazione del repository remoto o come hack sporco è possibile eliminare e ricreare il ramo in questo modo:
git push origin :master
git push origin master
In generale, l'ultimo parametro git push
utilizza il formato <local_ref>:<remote_ref>
, dove local_ref
è il nome del ramo nel repository locale ed remote_ref
è il nome del ramo nel repository remoto. Questa coppia di comandi utilizza due shorthands. :master
ha un local_ref nullo che significa che spinge un ramo null sul lato remoto master
, cioè cancella il ramo remoto. Un nome di ramo senza :
mezzi spinge il ramo locale con il nome dato al ramo remoto con lo stesso nome. master
in questa situazione è l'abbreviazione di master:master
.