Un modo molto semplice e rapido per annullare un git rebase
consiste nel reinserire le etichette del ramo.
Se si è sicuri di voler abbandonare l'attuale suggerimento di ramo version2
, è possibile iniziare con git reflog
(come hai fatto tu). I comprenderà il passo rebase
anche qui, e lascio in pochi arbitri "veri" abbreviate:
$ git checkout branch
$ git rebase --onto master start-after branch
... rebase output ...
# oops! dag-nab-it! didn't mean to do that!
$ git reflog
<rev..> [email protected]{0}: rebase finished: returning to refs/heads/branch
<rev..> [email protected]{1}: rebase: some commit msg...
05f7dc8 [email protected]{2}: rebase: checkout master
aa4e140 [email protected]{3}: checkout: moving from master to branch
Qui aa4e140
è dove il HEAD
del ramo era. Questo è anche disponibile in ORIG_HEAD
:
$ git log -1 --oneline ORIG_HEAD
aa4e140 some commit msg...
(uso più del registro, se è necessario, per assicurarsi che si sta andando al posto giusto.)
Se hai fatto qualche altra git cose da quando il rebase, ORIG_HEAD
potrebbe essere stato spostato, ma il reflog avrà il valore giusto. Se ORIG_HEAD
e quello che vedi nel reflog sono d'accordo, hai sicuramente il giusto valore. Ad ogni modo, assicurati di avere il giusto valore (e di non avere modifiche non salvate, che git status
sia pulito: puoi usare git stash
se necessario, qui).
Prova anche git reflog version2
, che ti mostrerà la cronologia dell'etichetta version2
.
Ora basta forzare l'attuale ramo-assicurarsi che è ancora quello che si desidera cambiare, al bersaglio commettere:
$ git branch
... see that you're still on "branch" or "version2" or whatever
$ git reset --hard aa4e140
Voila, le cose sono tornate al esattamente come erano prima è stato eseguito git rebase
.
Se non è stato fatto nulla per cambiare ORIG_HEAD
, è ancora più facile di tutto questo:
$ git log ORIG_HEAD # make sure that's what you want
...
$ git branch # make sure you're on `version2`
...
$ git reset --hard ORIG_HEAD
HEAD is now at ...
ma il metodo reflog
è più generale (funziona per circa un mese dopo il rebase, non importa cosa hai fatto in mezzo).
(Il periodo di tempo qui è configurabile, vedi git reflog documentazione Il giorno di scadenza predefinita 30 è per le voci reflog "non raggiungibile dalla punta corrente del ramo", che di solito è il caso per i vecchi commit da. . prima di un rebase)
la chiave per comprendere il motivo per cui in cui funziona è semplice: git rebase
mantiene il vostro vecchio impegna. Solo aggiunge nuovi commit al grafico di commit, quindi sposta l'etichetta. Con l'etichetta spostata, è più difficile vedere i tuoi vecchi commit: non vengono visualizzati per impostazione predefinita, sono solo nel "reflog", ma sono ancora lì. Rimetti l'etichetta e il nuovi commit sono quelli che non vengono visualizzati e quelli vecchi sono tutti indietro!
Puoi leggere di più su di esso nella mia risposta a [Cosa significa "a" @ segno/simbolo/carattere in Git?] (Http://stackoverflow.com/questions/17910096/what-does-the- at-sign-symbol-character-mean-in-git/17910097 # 17910097), l'ultima sezione. –