2010-03-12 9 views
30

Ho appena provato a rebase un ramo molto vecchio con una modifica secondaria sul mio master. Si è verificato un problema con la fusione di uno solo dei tre file coinvolti, quindi ho fatto un imprevisto --skip, pensando che sarebbe saltato quel file, ma come è successo, sembra aver saltato tutte le mie modifiche, e rotolato in avanti . Quindi ora il rebase è finito e le mie modifiche sembrano essere scomparse.Ripristino da salto involontario durante rebase

Ho visto la domanda su undoing rebase, ma è tutto greco per me, vedo il reflog, ma non so a quale commit è stato collegato il ramo prima del rebase.

In ogni caso, non ho davvero bisogno di annullare il rebase, voglio solo essere in grado di recuperare le modifiche nei due file. È comunque necessario farlo correttamente (in caso contrario, dovrò solo ripristinare il backup di ieri del mio repository e prelevare i bit a mano).

risposta

35

Per prima cosa, crea un archivio tar della tua cartella di lavoro git. Questo rende più facile provarlo più volte.

lascia supporre il seguente accaduto

  • git checkout altro-old-ramo
  • git rebase maestro
  • alcuni problemi (che è saltato)

a questo punto siete ora ancora in un altro ramo vecchio e il tuo reflog ti mostra:

6f8348f [email protected]{0}: rebase: <commit message of last commit in another-old-branch> 
e547ec0 [email protected]{1}: checkout: moving from another-old-branch to e547ec0d2a558d189464fc57192066b34ec5f28f^0 
65cedf8 [email protected]{2}: checkout: moving from master to another-old-branch 

Immaginate che le diramazioni siano come collegamenti simbolici (o puntatori), tutto ciò che dobbiamo fare è lasciare che il ramo 'un altro ramo vecchio' punti indietro sul vecchio commit-id. il vecchio commit è ancora lì e non è stato toccato dal tuo rebase. po: 'hey git, un altro-old-ramo è e547ec0d2, dimenticare tutto il resto che è accaduto'

Nel nostro caso qui che era e547ec0d2a558d189464fc57192066b34ec5f28f, quindi quello che dobbiamo fare ora è

  • git checkout un altro- vecchio ramo # se non siete già lì
  • git ripristinare e547ec0d2a558d189464fc57192066b34ec5f28f --hard

ora la vostra filiale è tornato alla normalità. E puoi riprovare il tuo rebase.

Si prega di notare che il vostro reflog è ormai un po 'più complicato di quanto sopra l'esempio. ma dovrebbe essere lì da qualche parte ...

buona fortuna!

+1

No, devo aver fottuto qualcos'altro mentre cercavo di riprendermi. Risposta contrassegnata per la prossima volta ... – Benjol

+8

+1; Un altro consiglio: 'git log -g' può essere un modo più carino di sfogliare il reflog. –

+2

Ha funzionato come un fascino! Ho appena salvato la mia mattinata grazie – kmanzana

Problemi correlati