2013-03-18 11 views
5

Desidero cancellare la mia directory di lavoro di alcuni file non salvati, ma ho eseguito accidentalmente git reset --hard.Git commit perso dopo il reset --hard. Non trovato da fsck, non in reflog

Mi sono reso conto che avevo perso il commit precedente (non premuto), quindi ho eseguito git reset --hard ORIG_HEAD. Questo non mi ha portato al mio impegno perso.

Ho eseguito git reflog, ma il commit non era elencato lì. Ho anche eseguito git fsck --lost-found, ma non ci sono stati commit nella lista, solo alcuni blob e alberi non correlati.

Poiché non riesco a trovare alcun riferimento del commit perduto (a parte lo .git/COMMIT_EDITMSG che ha ancora il messaggio di commit e l'elenco delle modifiche pertinenti), non sono sicuro di come procedere per il ripristino del commit.

C'è un modo per recuperare il commit perso, o dovrei prepararmi per una notte?

+0

Perché pensi di aver commesso un git per le modifiche locali? git reset non l'avrebbe perso. Se avevi solo modifiche non accettate, quelle sono sparite. – fche

+3

'git reset --hard' con nessun argomento commit-ish equivale a' git reset --hard HEAD', che non perderà commit, push o unpushed. Ripristinerà semplicemente il tuo indice e la directory di lavoro allo stato dell'ultimo commit effettuato, perdendo le modifiche a staging e nonstaged (ma non ancora committed). È probabile che il 'git reset --hard ORIG_HEAD' sia un problema, a seconda di quale sia esattamente l'ultimo comando che ha effettivamente aggiornato ORIG_HEAD, e quanto tempo fa era, e cosa hai fatto tra ... – twalberg

+0

Grazie, il commit perso è stato effettuato circa mezz'ora prima del 'git reset --hard'. –

risposta

9

Non sei sicuro del motivo per cui non riesci a trovare il tuo impegno, poiché il commento di @ twalberg su git reset --hard è corretto. Qui ci sono alcune cose da provare, però.

Hai il messaggio per l'impegno che stai cercando (.git/COMMIT_EDITMSG). Se è stato scritto COMMIT_EDITMSG, allora quel particolare commit dovrebbe essere da qualche parte. Scegliere un testo dal messaggio che è abbastanza singolare e provare questo:

git log -g --grep="<something specific from your commit message>"

Si passerà attraverso la reflog e trovare commette che il testo partita dal tuo messaggio di commit perso.

Se nessuna fortuna con questo, si può provare a guardare attraverso tutti i commit su ogni ramo:

git log --all --grep="<something specific from your commit message>"

Una volta trovato l'hash commit, è possibile controllarlo fuori, fare una nuova filiale, unirlo di nuovo nel tuo ramo corrente, ecc.

Tuttavia, se tutto fallisce, puoi provare a cercare gli oggetti presenti nel repository, ma non fanno parte di alcun commit (ad esempio, aggiunti all'indice, ma non impegnati.) Questa risposta può aiutarti con questo:

https://stackoverflow.com/a/7376959/845716

+1

Grazie Rob. Ho cercato i log git prima di pubblicare la domanda, ma il tuo link finale ["Undo git reset --hard"] (http://stackoverflow.com/a/7376959/845716) per vedere tutti gli oggetti lavorati!Non ho idea del perché non riesca a trovare il commit. Posso trovare i singoli file. –

Problemi correlati