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
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:
git push origin --delete
) 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