C'è un modo per recuperare le modifiche senza commit nella directory di lavoro da un git reset --hard HEAD
?
git reset --hard somewhere
è uno dei pochi comandi git davvero pericolosi.
C'è un modo per recuperare le modifiche senza commit nella directory di lavoro da un git reset --hard HEAD
?
git reset --hard somewhere
è uno dei pochi comandi git davvero pericolosi.
Risposte:
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-found
per 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 **
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! :)
git checkout HEAD@{19}
mi ha permesso di controllare i file persi in uno stato distaccato. Quindi utilizzato git checkout -b new-branch-name
per aggiungerli nuovamente al repository nello stato "collegato".
git checkout -b new-branch-name
. Il libro Pragmatic Version Control Using Git è bravo a spiegare Git in termini semplici.
Anche oggi ho eseguito accidentalmente git reset --hard
il 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 other
directory 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.
lost-found
. Ma poi potrei fare git show
per ottenere contenuti.
#!/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
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 .
git reset --hard
dall'uso di un altro, git reset --hard
ma se non si utilizza l' --hard
interruttore, si rimarranno delle voci nell'area di lavoro che ripristinerebbero effettivamente il lavoro appena recuperato.
git log
non ho visto l'ID del commit. Con git reflog
ho potuto vedere l'ID commit
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.
git reset HEAD@\{27\}
, grazie!
git reflog show
per controllare e da quel primo commit utilizzogit reset HEAD@{number}
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!
git reflog
non ha funzionato perché non ho eseguito il commit delle modifiche. git fsck --lost-found
ha 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
Ho appena fatto git reset --hard
e 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.
Per definizione, git reset --hard
eliminerà 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 HEAD
e 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.
git stash && git reset --hard
facesse spazzare via qualsiasi contenuto nascosto è giusto?
git reset --hard
non scarta la scorta. git stash
è un sostituto per, git reset --hard
nel senso che rimuove le modifiche non impegnate dal tuo worktree, tranne per il fatto che le mantiene al sicuro invece di scartarle permanentemente.
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 è 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
L'informazione è persa.
Dato che non ti sei impegnato, il tuo .git non ha mai memorizzato queste informazioni. Quindi, fondamentalmente git
non è 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.
git diff
. Salvare l'o / p in un file chiamato diff.patchpatch -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.
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 HEAD
e 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
È possibile recuperare un commit dopo aver eseguito un reset --hard HEAD
.
Utilizzare " git reflog
" per verificare la cronologia di HEAD
nel ramo.
Vedrai il tuo commit e il suo ID qui.
Fare un
git reset {commit Id of the commit you want to bring back}
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 + z
in 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!!
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.
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.
Ho git reset --hard
sbagliato 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
.
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
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.
( 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.
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.
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!
git reset
. Non hai bisogno di quel comando ed è pericoloso, quindi non usarlo. Per riportare il ramo al commit precedentegit rebase -i
e rilasciare i commit che non vuoi ogit checkout
(stacca la testa) seguito dagit branch -M
per 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.