Annullare un ‘git push’

Ecco cosa ho fatto sul mio ramo presunto-stabile

% git rebase master First, rewinding head to replay your work on top of it... Fast-forwarded alpha-0.3.0 to master. % git status # On branch alpha-0.3.0 # Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits. # nothing to commit (working directory clean) % git push Fetching remote heads... refs/ refs/heads/ refs/tags/ refs/remotes/ 'refs/heads/master': up-to-date updating 'refs/heads/alpha-0.3.0' from cc4b63bebb6e6dd04407f8788938244b78c50285 to 83c9191dea88d146400853af5eb7555f252001b0 done 'refs/heads/unstable': up-to-date Updating remote server info 

È stato tutto un errore, come ho capito in seguito. Vorrei annullare l’intero processo e ripristinare il ramo alpha-0.3.0 indietro a quello che era.

Cosa dovrei fare?

È necessario assicurarsi che nessun altro utente di questo repository stia recuperando le modifiche errate o provando a compilare in aggiunta ai commit che si desidera rimuovere perché si sta per riavvolgere la cronologia.

Quindi devi forzare il vecchio riferimento.

 git push -f origin last_known_good_commit:branch_name 

o nel tuo caso

 git push -f origin cc4b63bebb6:alpha-0.3.0 

Potrebbe essere stato receive.denyNonFastForwards sul repository remoto. Se questo è il caso, allora riceverai un errore che include la frase [remote rejected] .

In questo scenario, dovrai eliminare e ricreare il ramo.

 git push origin :alpha-0.3.0 git push origin cc4b63bebb6:refs/heads/alpha-0.3.0 

Se ciò non funziona, forse perché hai receive.denyDeletes impostato, devi avere accesso diretto al repository. Nel repository remoto, devi fare qualcosa come il seguente comando idraulico.

 git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8 

Credo che puoi anche fare questo:

 git checkout alpha-0.3.0 git reset --hard cc4b63bebb6 git push origin +alpha-0.3.0 

Questo è molto simile all’ultimo metodo, eccetto che non devi andare in giro nel repository remoto.

git revert è meno pericoloso di alcuni degli approcci suggeriti qui:

 prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650 [master 71738a9] Revert "Issue #482 - Fixed bug." 4 files changed, 30 insertions(+), 42 deletions(-) prompt> git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # nothing to commit (working directory clean) prompt> 

Sostituisci 35f6af6f77f116ef922e3d75bc80a4a466f92650 con il tuo commit.

La soluzione accettata (da @charles bailey) è molto pericolosa se si sta lavorando in un repository condiviso.

Come best practice, tutti i commit spinti a un repo remoto condiviso devono essere considerati “immutabili”. Utilizza invece “git revert”: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

Un modo per farlo senza perdere le modifiche che volevi:

 git reset cc4b63b git stash git push -f origin alpha-0.3.0 git stash pop 

Quindi puoi scegliere i file che avevi intenzione di spingere

Un altro modo per farlo:

  1. crea un altro ramo
  2. controlla il commit precedente su quel ramo usando “git checkout”
  3. spingere il nuovo ramo.
  4. cancella il vecchio ramo e spingi l’eliminazione (usa git push origin --delete )
  5. rinominare il nuovo ramo nel vecchio ramo
  6. spingere di nuovo.
 git push origin +7f6d03:master 

Questo ripristinerà il tuo repo al numero di commit indicato

Annulla più commit git reset –hard 0ad5a7a6 (Basta fornire commit hash SHA1)

Annulla l’ultimo commit

git reset –hard HEAD ~ 1 (le modifiche all’ultima commit verranno rimosse) git reset –soft HEAD ~ 1 (le modifiche all’ultima commit saranno disponibili come modifiche locali non modificate)

Scenario 1 : se si desidera annullare l’ultimo commit, dire 8123b7e04b3, sotto è il comando (questo ha funzionato per me):

 git push origin +8123b7e04b3^: 

L’output si presenta come di seguito:

 Total 0 (delta 0), reused 0 (delta 0) To https://testlocation/code.git + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update) 

Informazioni aggiuntive: Scenario 2 : In alcune situazioni, potresti voler ripristinare ciò che hai appena annullato (in pratica annulla l’annullamento) tramite il comando precedente, quindi utilizzare il comando seguente:

 git reset --hard 8123b7e04b3 

Produzione:

 HEAD is now at cc6206c Comment_that_was_entered_for_commit 

Maggiori informazioni qui: https://github.com/blog/2019-how-to-undo-almost-anything-with-git

Questo cancellerà l’ultimo commit spinto nel ramo remoto (master o ramo):

 git push origin +HEAD^:master