Rollback di un repository Git remoto


111

Ho un repository Git remoto e ho bisogno di ripristinare gli ultimi ncommit nel freddo oblio.

Risposte:


135

È possibile utilizzare git revert <commit>…per tutti gli n commit, quindi eseguire il push come al solito, mantenendo la cronologia invariata.

Oppure puoi "tornare indietro" con git reset --hard HEAD~n. Se stai spingendo in un repository pubblico o condiviso, potresti divergere e interrompere il lavoro degli altri in base al tuo ramo originale. Git ti impedirà di farlo, ma puoi usare git push -fper forzare l'aggiornamento.


5
È possibile eseguire il rollback a un commit specifico utilizzando: git reset --hard [sha1]dove sha1 è l'identificatore hash del commit.
pisaruk

7
Non è possibile utilizzare get reset --hard in un repository remoto poiché non esiste una directory di lavoro. La domanda originale afferma solo che esiste un repository remoto, non si fa menzione di un repository locale.
Hazok

2
solo una nota, git push -f forzerà il push di tutte le filiali locali sui loro telecomandi
cowlinator

Tieni presente che l'utilizzo revertfarà sì che i rami delle tue funzioni vengano considerati come "già" uniti. Questo perché questi rami vengono effettivamente uniti. Ma le modifiche sono state annullate. Soluzione: scegli o annulla il commit di ripristino .
Benedikt

@Benedikt fa sì che reset --hardanche i rami della funzione vengano trattati come già uniti? La mia ipotesi è che non sarebbe (dove revertsarebbe).
Marcus Leon

37

elmarco ha ragione ... il suo suggerimento è il migliore per archivi condivisi / pubblici (o, almeno, rami pubblici). Se non è stato condiviso (o sei disposto a disturbare gli altri) puoi anche spingere un particolare riferimento:

git push origin old_master:master

Oppure, se c'è un particolare commit SHA1 (diciamo 1e4f99e in forma abbreviata) a cui vorresti tornare:

git push origin 1e4f99e:master

9

Fortunatamente sono stato in grado di utilizzare la soluzione di Pat Notz che ha completamente rimosso il commit indesiderato. Tuttavia, inizialmente ho ricevuto l'errore

error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*

Ma l'aggiunta -fdell'opzione force ( ) sovrascrive questo errore

git push -f origin 52e36b294e:master

3

Se hai accesso diretto al repository remoto, puoi sempre utilizzare:

git reset --soft <sha1>

Questo funziona poiché non c'è alcun tentativo di modificare la directory di lavoro inesistente. Per maggiori dettagli vedere la risposta originale:

Come posso annullare il commit dell'ultimo commit in un repository git bare?


2
Perché sarebbe --softanche necessario? Probabilmente potresti fare la stessa cosa con just plain git reset, senza il mode flag.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.