Ripristina da git reset --hard?


457

C'è un modo per recuperare le modifiche senza commit nella directory di lavoro da un git reset --hard HEAD?


49
Consiglierei di disimparare git reset. Non hai bisogno di quel comando ed è pericoloso, quindi non usarlo. Per riportare il ramo al commit precedente git rebase -ie rilasciare i commit che non vuoi o git checkout(stacca la testa) seguito da git branch -Mper spostare la punta del ramo. Il primo rifiuta di essere eseguito con le modifiche locali e il successivo verrà eseguito solo se i file modificati localmente non differiscono tra le revisioni.
Jan Hudec,

11
@Jan Non ci credo. Esistono motivi perfettamente legittimi per utilizzare il ripristino.
spaaarky21,

4
@ spaaarky21: Sì, ci sono. Ma git reset --hard somewhereè uno dei pochi comandi git davvero pericolosi.
Jan Hudec,

5
@Jan Sono d'accordo ma essere pericoloso non significa che non dovresti usarlo. Basta sapere cosa stai facendo e stai attento. :)
spaaarky21

3
Non correlato a Annullamento di un reset git --hard HEAD ~ 1 , perché qui il poster originale sta cercando di recuperare le modifiche non confermate.

Risposte:


477

Non puoi recuperare le modifiche non confermate in generale.

Le modifiche precedentemente organizzate ( git add) dovrebbero essere recuperabili dagli oggetti indice, quindi se lo hai fatto, usa git fsck --lost-foundper localizzare gli oggetti ad esso correlati. (Questo scrive gli oggetti nella .git/lost-found/directory; da lì puoi usare git show <filename>per vedere il contenuto di ogni file.)

In caso contrario, la risposta qui sarebbe: guarda il tuo backup. Forse il tuo editor / IDE archivia le copie temporanee in / tmp o C: \ TEMP e cose del genere. [1]

git reset HEAD@{1}

Questo ripristinerà la precedente HEAD

[1] vim, ad esempio, memorizza facoltativamente l'annullamento persistente, l' IDE di eclissi memorizza la cronologia locale ; tali funzionalità potrebbero salvare il tuo **


18
La storia locale di Eclipse - e inoltre, dato che alcune modifiche erano più vecchie di 6 giorni, il mio backup di Time Machine della storia locale di Eclipse! Per qualche motivo il backup di Time Machine della cartella gestita da git non conteneva le mie precedenti modifiche.
christianbrodbeck,

2
Sei un serio salvavita sul suggerimento! TextWrangler aveva un backup dei file. Grazie
Vivek Sampara il

6
L'IDE (IntelliJ) ha archiviato localmente le modifiche che hanno salvato la giornata. Grazie per il consiglio!
progonkpa,

1
Wow, questo è fantastico. Funziona anche se non hai mai effettuato un commit.
Boudewijn Aasman,

2
In effetti la storia locale in Eclipse (nel mio caso Intellij) salva la mia giornata nel recupero di cambiamenti non di scena, doc qui per Intellij: blog.jetbrains.com/idea/2008/01/…
Richard

449

risposta da questo SO

$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

Hai riavuto la tua giornata! :)


24
Solo per aggiungere a questa risposta ciò aiuterebbe le persone che hanno effettivamente commesso modifiche che sono state gettate via tramite hard reset.
Murki,

9
Fantastico, ma nel mio caso i file erano spariti completamente. Usando git checkout HEAD@{19}mi ha permesso di controllare i file persi in uno stato distaccato. Quindi utilizzato git checkout -b new-branch-nameper aggiungerli nuovamente al repository nello stato "collegato".
NightOwl888

@ NightOwl888: Git newbie qui e ho avuto lo stesso problema che i miei file erano ancora andati. Potresti spiegare in modo più dettagliato come hai recuperato i tuoi file in uno stato "allegato" (o potresti spiegare cosa significa effettivamente)? Grazie mille!
OhDaeSu,

3
@ user3385759 - In Git, quando usi il comando di checkout su qualsiasi cosa che non sia un ramo, entrerà in una speciale modalità "testa staccata". Ciò significa che non stai effettivamente puntando a una filiale, ma puoi visualizzare ciò che è stato archiviato nello stato dell'entità (in questo caso una voce di reflog). Da quello stato, puoi trasformarlo in un ramo "reale" al quale puoi tornare di nuovo usando git checkout -b new-branch-name. Il libro Pragmatic Version Control Using Git è bravo a spiegare Git in termini semplici.
NightOwl888

2
Sì, cosa hanno detto NomNomCameron e Jesse Adelman. Ho erroneamente pensato che il reset sarebbe stato ripristinato al mio ultimo commit. No. Ha spazzato via tutto. Questa risposta mi ha salvato da un giorno o due dal ricreare il mio lavoro.
VeteranCoder,

308

Anche oggi ho eseguito accidentalmente git reset --hardil mio repository pur avendo apportato modifiche non impegnate anche oggi. Per riaverlo, ho corso git fsck --lost-found, che ha scritto tutte le BLOB senza riferimenti <path to repo>/.git/lost-found/. Dato che i file non sono stati ripristinati, li ho trovati nella otherdirectory all'interno di <path to repo>/.git/lost-found/. Da lì, posso vedere i file senza commit utilizzando git show <filename>, copiare i BLOB e rinominarli.

Nota: funziona solo se hai aggiunto i file che vuoi salvare nell'indice (usando git add .). Se i file non erano nell'indice, vengono persi.


4
Ho solo file con riferimenti di commit in lost-found. Ma poi potrei fare git showper ottenere contenuti.
Mitar,

6
Solo per risparmiare tempo a chiunque#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "Processing $f file..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
pubblicato il

209

Sì, PUOI RECUPERARLO da un hard reset in git.

Uso:

git reflog

per ottenere l'identificatore del tuo commit. Quindi utilizzare:

git reset --hard <commit-id-retrieved-using-reflog>

Questo trucco mi ha salvato la vita un paio di volte.

Puoi trovare la documentazione di reflog QUI .


9
Finora penso che questa sia la risposta migliore e più concisa. Potrebbe sembrare contro intuitivo recuperare git reset --harddall'uso di un altro, git reset --hardma se non si utilizza l' --hardinterruttore, si rimarranno delle voci nell'area di lavoro che ripristinerebbero effettivamente il lavoro appena recuperato.
Ryan H.

2
Funziona come un fascino! La risposta precedente ( stackoverflow.com/questions/5788037/recover-from-git-reset-hard/… ) non ha funzionato per me.
codemax,

3
Questa risposta non è corretta Questo approccio recupera solo le modifiche precedentemente impegnate . Non sarà in grado di ripristinare le modifiche non confermate (che è di questo che tratta questa domanda).
Alderath,

2
Questa soluzione funziona per me. Ho effettuato un hard reset e poi quando lo ho usato git lognon ho visto l'ID del commit. Con git reflogho potuto vedere l'ID commit
dboscanv il

2
questo funziona per me. Grazie!!!!!!
RedEyed

60

Mentre stavo lavorando a un progetto locale, volevo spostarlo su GitHub e quindi ho creato un nuovo repository. Mentre stavo cercando di aggiungere tutti questi file al nuovo repository con .gitignore, ho accidentalmente aggiunto un file sbagliato e poi ho provato a cancellarlo.

Ho corso git reset --hard origin/master: P

Quindi tutti i miei file locali sono stati eliminati perché il repository era vuoto. Pensavo che tutto fosse finito.

Questo mi ha salvato la vita:

git reflog show
git reset HEAD@{1} 
git push 

Spero che salvi un'altra vita.


Per me è stato git reset HEAD@\{27\} , grazie!
4

1
Ho 7 commit da resettare, utilizzo git reflog showper controllare e da quel primo commit utilizzogit reset HEAD@{number}
Vishwas Nahar

38

Se usi qualcosa come IntelliJ:

Nel menu di scelta rapida, selezionare Cronologia locale e fare clic su Mostra cronologia nel sottomenu:

La vista della cronologia locale per un progetto o una cartella mostra tutto ciò che hai fatto negli ultimi giorni. Nella colonna Azione della parte inferiore della finestra di dialogo, selezionare l'azione che si desidera ripristinare. [...] Così facendo, la parte superiore della finestra di dialogo mostra la vista ad albero dei file modificati. Se si desidera ripristinare solo il file eliminato, indipendentemente dalle altre modifiche apportate da allora, è possibile selezionare il file Lost.txt nella vista ad albero e fare clic sul pulsante Ripristina.

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

Questo mi ha appena fatto uscire il culo!


Questa è di gran lunga la migliore risposta per gli utenti IntelliJ! Grazie mille, ha funzionato perfettamente. Ho provato ogni altra soluzione e nessuno di loro ha funzionato bene. git reflognon ha funzionato perché non ho eseguito il commit delle modifiche. git fsck --lost-foundha funzionato per i file in scena ma non tutti sono stati messi in scena. La cronologia locale di IntelliJ ha perfettamente recuperato i miei file non salvati, sono molto grato per questa funzione
Denes Papp

30

Ho appena fatto git reset --harde perso tutte le mie modifiche non confermate. Fortunatamente, utilizzo un editor (IntelliJ) e sono stato in grado di recuperare le modifiche dalla cronologia locale. Eclipse dovrebbe permetterti di fare lo stesso.


20

Per definizione, git reset --hardeliminerà le modifiche non confermate senza che Git possa recuperarle (il sistema di backup potrebbe essere d'aiuto, ma non Git).

In realtà, ci sono pochissimi casi in cui git reset --hardè una buona idea. Nella maggior parte dei casi, esiste un comando più sicuro per fare la stessa cosa:

  • Se si desidera eliminare le modifiche non confermate, utilizzare git stash. Manterrà un backup di queste modifiche, che scadranno dopo qualche tempo se si esegue git gc. Se sei sicuro al 99,9% di non aver mai più bisogno di queste modifiche, allora git stashè ancora tuo amico per il caso dello 0,1%. Se sei sicuro al 100%, allora git stashè ancora tuo amico perché questi al 100% hanno un errore di misurazione ;-).

  • Se vuoi spostare la tua HEADe la punta dell'attuale ramo nella storia, allora git reset --keepè tuo amico. Farà la stessa cosa di git reset --hard, ma non annullerà le modifiche locali.

  • Se vuoi fare entrambe le cose, allora git stash && git reset --keepè tuo amico.

Insegna alle dita a non usare git reset --hard, ti rimborserà un giorno.


quindi se uno lo git stash && git reset --hardfacesse spazzare via qualsiasi contenuto nascosto è giusto?
jxramos,

1
No, git reset --hardnon scarta la scorta. git stashè un sostituto per, git reset --hardnel senso che rimuove le modifiche non impegnate dal tuo worktree, tranne per il fatto che le mantiene al sicuro invece di scartarle permanentemente.
Matthieu Moy,

oppure
esegui

11

se hai accidentalmente azzerato un commit, quindi esegui questa operazione,

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

supponendo HEAD@{2}sia lo stato in cui desideri tornare


questo ha funzionato perfettamente per me se lo fai su PowerShell, assicurati di scriverlo in questo modo ripristinando 'HEAD @ {2}' altrimenti non funzionerà in PowerShell
VectorX

10

Questo è ciò che faccio di solito se perdo alcune modifiche.

git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

per riportare il puntatore ai tuoi precedenti commit ma mantenendo le modifiche apportate finora nel checkout dei tuoi ultimi commit git reset --soft dadada


8

L'informazione è persa.

Dato che non ti sei impegnato, il tuo .git non ha mai memorizzato queste informazioni. Quindi, fondamentalmente gitnon è possibile recuperarlo per te.

Ma, se lo hai appena fatto git diff, c'è un modo per recuperare usando l'output del terminale con i seguenti 3 semplici passaggi.

  1. scorrere il terminale e cercare l'o / p di git diff. Salvare l'o / p in un file chiamato diff.patch
  2. Cerca e sostituisci tutti i 7 spazi e 8 spazi con il carattere tab (\ t) e salva le modifiche.
  3. Entra nel tuo repository git. Applica il diff.patch ( patch -p1 < diff.patch)

Sei salvato! :)

Nota: durante la copia dei dati dal terminale a un file, fare attenzione e vedere chiaramente che i dati sono output continuo e non contenevano dati ridondanti (a causa della pressione delle frecce su e giù). Altrimenti potresti rovinarlo.


7

Ho riscontrato lo stesso problema e stavo quasi impazzendo .... inizialmente ho commesso il progetto e mi sono unito .. più tardi, quando provo a correre, git push --set-upstream origin master ricevo questo errore

  fatal: refusing to merge unrelated histories

così ho corso git reset --hard HEADe ho eliminato un progetto di 3 settimane ma questi pochi comandi di seguito salvano il giorno:

git reset HEAD@{1}         //this command unstage changes after reset
git fsck --lost-found      //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b

spero che sia di aiuto


6

È possibile recuperare un commit dopo aver eseguito un reset --hard HEAD.

Utilizzare " git reflog" per verificare la cronologia di HEADnel ramo.

Vedrai il tuo commit e il suo ID qui.

Fare un

git reset {commit Id of the commit you want to bring back}

5

Se per fortuna hai aperto gli stessi file su un altro editor (es. Sublime Text) prova un ctrl-z su quelli. Mi ha appena salvato ..


3

Ho scoperto nel modo più duro che qualsiasi file senza commit prima di essere git reset --hard <commit>rimosso dalla cronologia di Git. Tuttavia, ho avuto la fortuna di tenere aperta la mia sessione di editor di codice durante tutto il periodo in cui mi sono strappato i capelli, ho scoperto che un semplice control + zin ciascuno dei file interessati ha riportato lo stato del file alla versione precedente a Git così resettare obbligatoriamente tutto ciò a cui non l'ho chiesto specificamente.Hooray!!


3

Se stai cercando di utilizzare il codice seguente:

git reflog show
# head to recover to
git reset HEAD@{1} 

e per qualche motivo stanno ottenendo:

errore: interruttore sconosciuto `e '

quindi prova a racchiudere le HEAD@{1}virgolette

git reset 'HEAD@{1}'

3
 git reset HEAD@{4}

4 sono le modifiche prima di 4 passaggi fa. se selezioni un passaggio corretto, dovrebbe mostrare l'elenco dei file che hai rimosso dal disco rigido. Quindi fa:

$ git reflog show

ti mostrerà la cronologia del commit locale che abbiamo già creato. ora fai:

$ git reset --hard 8c4d112

8c4d112 è un codice che si desidera ripristinare il proprio lì. diamo un'occhiata a https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history per ottenere maggiori informazioni.


Grazie mille @mohammad, mi ha salvato. Non ho potuto vedere i miei file di origine in precedenza, ma seguendo i passaggi precedenti sono stato in grado di recuperare tutti i miei file di origine.
Gaurav Bansal,

2

Risposte corrette. OK, ora mi piace Git. :-) Ecco una ricetta più semplice.

git log HEAD@{2}
git reset --hard  HEAD@{2}

Dove "2" è il numero di ritorno a dove hai effettuato le modifiche. Nel mio caso, interrotto dal collega e dal capo per aiutare il debug di alcuni problemi di compilazione; così, ha fatto un reset --hard due volte; così, HEAD e HEAD @ {1} erano sovrascritti. Accidenti, avremmo perso un duro lavoro.


2

Ho git reset --hardsbagliato progetto per errore (lo so ...). Avevo appena lavorato su un file ed era ancora aperto durante e dopo aver eseguito il comando.

Anche se non mi ero impegnato, sono stato in grado di recuperare il vecchio file con il semplice COMMAND + Z.


0

Risposta di riferimento da questo SO,

Dopo aver eseguito git reflog show, dì che vuoi andare a impegnare 9300f9d

dopo aver eseguito git reset 9300f9d

è possibile eseguire lo stato git e quindi potrebbe essere necessario effettuare il checkout dei file per ripristinare le modifiche

git checkout - percorso / nome file


0

Se stai sviluppando su Netbeans, guarda tra le schede dei file e l'area di modifica dei file. C'è una "Fonte" e "Storia". Su "Cronologia" vedrai le modifiche apportate usando il controllo versione (git / other), ma anche le modifiche apportate localmente. In questo caso, le modifiche locali potrebbero salvarti.


0

( risposta adatta per un sottoinsieme di utenti )

Se sei su (qualsiasi recente) macOS e anche se sei lontano dal tuo disco di Time Machine, il sistema operativo avrà salvati backup orari, chiamati snapshot locali .

Inserisci Time Machine e vai al file che hai perso. Il sistema operativo ti chiederà quindi:

The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?

Dovresti essere in grado di recuperare i file persi.


0

Se hai aperto un IDE con lo stesso codice, prova a fare un ctrl + z su ogni singolo file a cui hai apportato modifiche. Mi ha aiutato a recuperare le mie modifiche non impegnate dopo aver eseguito git reset --hard.


-3

Quando eseguiamo git reset, vengono eliminati tutti i cambiamenti locali e non sottoposti a commit. Per ripristinare le modifiche: nell'IDE fai clic sul file, confronta il file con la cronologia locale che elencherà le modifiche alla data e possiamo recuperare i dati. La tua giornata è salvata!


1
Questa risposta ripete due precedenti.
Isherwood,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.