2010-02-27 27 views
12

Ho perso l'ultimo commit perché ho eseguito accidentalmente "git reset --hard HEAD ^". Nota: non volevo mettere il "^" alla fine.Lost Last Git Commit

C'è un modo per riaverlo? E 'stato 2 giorni di lavoro :(

+2

In ogni caso, NON utilizzare git gc. Ciò rimuoverà i commit non collegati in modo permanente. – Tronic

+0

No, gc * non * perderà il commit a meno che non ti sia impedito di fare in modo che Git dimentichi i tuoi commit (disabilitazione o eliminazione aggressiva). Chiunque abbia speso abbastanza tempo per imparare come configurare git per perdere il proprio commit più recente dovrebbe almeno sapere di non fare la domanda. – Dustin

+5

'git gc' per impostazione predefinita non rimuove i commit non collegati se sono in reflog fino a 30 giorni nel caso di commit non referenziati (di default). –

risposta

25

Penso che this article è quello che state cercando Secondo l'articolo, il vostro commettere è "andato", ma non garbage collection - un po 'come il cestino in Windows

si esegue git fsck --lost-found. per trovare il "dangling commit" e guardarlo con git reflog, quindi unire il commit penzolante con il ramo corrente, git merge 7c61179.

+0

Grazie. Questo è stato. Sapevo che era solo in giro in qualche posto, scollegato dal ramo. –

+0

In combinazione con difftool, ho risolto il problema "lost commit": git fsck --lost-found (gli hash di commit penzolanti sono visualizzati) git difftool Qualcuno_HASH somefolder/(Ho provato tutti i commit penzoloni, fino a quando ho trovato quello necessario) –

6

Se si conosce l'ID commit (ad esempio scorrere indietro sul vostro terminale o utilizzare git reflog),

git reset --hard 61567de5d9 

Dove 61567de5d9 sono le prime cifre del più recente (perduto) commit ..

21

git rende davvero facile tornare a uno stato precedente e lavora molto duramente per evitare di perdere i dati che hai commesso. È per questa ragione che dovresti impegnarti spesso. Ho un comando git trash che esegue lo stato git reset --hard, ma dopo aver scritto un commit in modo da poter annullare il ripristino completo se necessario.

Per lo stato più recente (vale a dire il tuo caso esatto), basta fare git reset --hard ORIG_HEAD per annullare ciò che hai appena fatto.

Si può fare una volta a base di azzerare: git reset --hard '@{5 minutes ago}' di mettere se stessi in uno stato precedente in base al tempo (ci sono un sacco di opzioni che è possibile utilizzare, ad esempio, git reset --hard '@{yesterday}' far finta di oggi non è mai avvenuto).

Altrimenti, sfogliare il git reflog uscita per trovare la cosa prima che l'azione si sente di mettere in cattivo stato e ripristinare a questo.

+1

Più generale puoi usare '@ {1}', o 'HEAD @ {1}' invece di 'ORIG_HEAD'. –