2013-09-24 21 views
6

ho Ribasato mio ramo version2 contro master utilizzando:annullare una rebase git utilizzando sul

git rebase --onto master version1 version2 

Come posso annullare questo?

per annullarla ho fatto git reflog

Attualmente, git status (su version2) mi da:

Your branch and 'origin/version2' have diverged, 
and have 2563 and 222 different commits each, respectively. 
nothing to commit (working directory clean) 

Voglio annullare questo rebase.

risposta

6

Supponendo che non hai modificato il ramo version2 dal momento che Ribasato esso, tutto quello che dovete fare è un hard reset del ramo alla sua posizione prima della prima, utilizzando la sintassi <reference>@{n}, dove n è la posizione prima ennesimo di riferimento :

git checkout version2 
git reset --hard [email protected]{1} 
+0

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. –

12

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 rebasemantiene 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!

+0

Grazie per la spiegazione nell'ultimo paragrafo. Nessuna delle altre risposte che ho visto l'ha fatto. – bunnyhero

+0

D'accordo con Bunnyhero. azzerare il valore di rebase non ha senso finché non si capisce che nulla è veramente perso in git, e gitX non mostra parti di commit tree che non sono raggiungibili da oggetti ref –