Risposte:
È 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 -f
per forzare l'aggiornamento.
revert
farà 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 .
reset --hard
anche i rami della funzione vengano trattati come già uniti? La mia ipotesi è che non sarebbe (dove revert
sarebbe).
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
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 -f
dell'opzione force ( ) sovrascrive questo errore
git push -f origin 52e36b294e:master
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?
git reset --hard [sha1]
dove sha1 è l'identificatore hash del commit.