Git come eseguire il rollback di un rebase


104

In Git, come esegui il rollback di un rebase se non sei soddisfatto?

Git non ha run a secco per rebase. Se ho fatto un rebase e non l'ho ancora inviato, come faccio a tornare indietro a prima, come se non fosse mai successo?


4
git rebase --abort
olibiaz

2
Cosa intendi per "fallito"? Hai completato il rebase e non ti piacciono i risultati? O hai colpito i conflitti e vuoi interrompere il rebase nel mezzo? Presumo il primo, dal momento che non puoi spingere un rebase in conflitto e incompiuto, ma lo chiedo perché sono due domande diverse.
Edward Thomson

sì, ex. Grazie.
user1615666

3
Possibile duplicato di Undoing a git rebase
Jon Schneider

Risposte:


213

Puoi usare il reflog per trovare la prima azione prima che il rebase inizi e poi resettare --hard torna ad essa. per esempio

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Ora dovresti tornare a prima dell'inizio del rebase.

Per trovare il posto giusto in cui reimpostare, seleziona la voce più vicina all'inizio che non inizia con "rebase".

Approccio alternativo

Se il rebase è l' unica cosa che hai fatto sul ramo, cioè non hai commit / modifiche non premuti - allora potresti semplicemente eliminare il ramo locale con git branch -De poi controllarlo di nuovo:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Oppure, per lo stesso effetto, puoi reimpostare --hard al ramo di origine:

$ git reset --hard origin/my-branch

Se lo hai fatto mentre avevi altri commit non premuti, li avrai persi. In tal caso, usa semplicemente l'approccio reflog sopra per tornare alla voce reflog dove hai fatto il commit (i).


11
Un'altra comoda scorciatoia: rebase imposta ORIG_HEADil valore hash originale del ramo che viene ribasato. Quindi, invece di trovare il numero 2 per HEAD@{2}, puoi semplicemente usare ORIG_HEAD... ma solo se ORIG_HEADè ancora indisturbato. Un sacco di comandi Git lo impostano (rebase, am, reset e merge, in varie circostanze).
torek

1
Grazie Signore! Grande aiuto su questo :)
Alec

1
grazie per il mio codice sorgente .... dopo aver usato questo $ git reset HEAD @ {2} --hard
reza rahmad

Ottiene il mio voto positivo per aver suggerito di eliminare semplicemente il ramo locale e tirarlo di nuovo!
quicklikerabbit

1
Questo è un salvavita. Grazie @Robbie
Nelson Katale il

42

Rebase mantiene un backup del vecchio stato come ORIG_HEAD.
Quindi puoi ripristinare l'ultimo rebase eseguendo:

git reset --hard ORIG_HEAD

1
Sai dove è documentato quel tag?
Ben S,

C'è qualche svantaggio in questo o è una nuova funzionalità? Sembra molto più facile che setacciare un reflog.
1252748

Non è nuovo. Ma di solito lo useresti subito dopo il rebase, non puoi tornare indietro dopo diversi rebase ecc. Per queste situazioni complesse andresti a caccia di cose di relog, ma solo per "oops, cosa ho fatto? Come posso tornare indietro quello adesso? " funziona benissimo.
Meligy
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.