git recupera il file cancellato in cui non è stato effettuato alcun commit dopo l'eliminazione


812

Ho cancellato alcuni file.

NON mi sono ancora impegnata.

Voglio ripristinare il mio spazio di lavoro per recuperare i file.

Ho fatto un git checkout ..

Ma i file eliminati mancano ancora.

E git statusmostra:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

Perché non git checkout .reimpostare l'area di lavoro su HEAD?


16
se non avessi messo in scena le modifiche dopo l'eliminazione, git checkout .avrebbe funzionato bene.
faizal

10
@faizal e perderai le modifiche se lo fai.
Vasiliy York, il

1
Premi Ctrl-J in git gui sull'elemento eliminato.
ajeh,

git checkout - cc.properties store / README store / cc.properties
Vinod Pasi

Vedi questa risposta: quora.com/…
live-love

Risposte:


787

L'output ti dice cosa devi fare. git reset HEAD cc.propertieseccetera.

Questo annullerà la messa in scena dell'operazione rm. Dopodiché, eseguendo di git statusnuovo un comando ti dirà che devi fare un git checkout -- cc.propertiesper riavere il file.

Aggiornamento: ho questo nel mio file di configurazione

$ git config alias.unstage
reset HEAD

che di solito uso per mettere in scena cose.


5
Come si fa per più file eliminati? Eseguire git reset HEAD <<nomefile>> più volte sarebbe ingombrante, un modo efficace per farlo?
Sottosuolo del

70
git reset HEAD \*e poigit checkout -- .
Noufal Ibrahim

3
ma ho modificato i file.
Jiang YD,

@RauliRajande È probabile che la tua situazione sia diversa da quella descritta nella domanda originale.
Noufal Ibrahim,

1
rm -r ./engines- oops. Ora git reset engines; git checkout engines.
Kris,

209

Hai eliminato la cancellazione, quindi devi fare:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . esegue il checkout dall'indice solo se la cancellazione è già stata gestita.


177

Basta fare git checkout path/to/file-I-want-to-bring-back.txt


8
funziona solo se non è stato eseguito il commit e il push dei file.
mahen3d,

23
Non ha funzionato per me, Git ha detto che non conosce alcun file con quel nome, anche se il file viene monitorato. Neanche io mi sono impegnato, ho solo cancellato un file usando erroneamente il menu contestuale di netbeans.
Zelphir Kaltstahl,

4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov,

@ user3479125 Immagino che il tuo file non sia mai stato eseguito il commit. Cosa git statusdice al riguardo?
ki92,

12
Lo stato di Git ha mostrato che "file eliminato ..ext" verde ha git checkout HEAD -- file.extcontribuito a ripristinarlo.
Ivan Borshchov,

144

Per ripristinare tutte le eliminazioni non in scena contemporaneamente, automaticamente, senza specificare ogni singolo percorso:

git ls-files -z -d | xargs -0 git checkout --

Per recuperare tutti in scena le eliminazioni in una sola volta, automaticamente, senza specificare ogni singolo percorso:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

12
Ho cancellato accidentalmente oltre 500 file e questo ha funzionato a meraviglia perché ha anche mantenuto tutte le mie modifiche valide (la prima riga è quella che ho usato). Grazie.
Guy Lowe,

1
Eliminato accidentalmente tutti i contenuti di un repository subito dopo una compilazione riuscita. Il primo comando mi ha salvato la pancetta.
MonaLisaOverdrive

2
Prima che funzionasse per me, dovevo correre git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn,

1
Molto utile, voleva mantenere i file non tracciati ma sbarazzarsi di cancellati e modificati, appena cambiato da -d a -m per la gestione dei modificati.
RaisinBranCrunch

5
Nota che non funziona se hai spazi nei nomi / percorsi dei file. Penso git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --che funzionerà.
prezzemolo

79

Dal momento che stai facendo un git checkout ., sembra che tu stia cercando di ripristinare il tuo ramo all'ultimo stato di commit.

Puoi farlo con a git reset HEAD --hard

avvertimento

In questo modo è possibile rimuovere tutte le ultime modifiche e mettere in scena le modifiche, ad esempio, si può perdere il lavoro. Esso può essere quello che vuoi, ma controllare la documentazione per assicurarsi.


39
Woww !! Attento con questo !!!! Potresti avere ragione, ma qualcuno potrebbe essere confuso e far esplodere l'intero codice. Sarebbe bello se aggiungi un avviso più grande.
santiagobasulto,

3
Questo è esattamente ciò di cui avevo bisogno. Non fa esplodere l'intero codice: ti riporta semplicemente al tuo ultimo commit.
Andrew Hendrie,

2
Ho finito con centinaia di file mancanti a un certo punto. Questo è l'unico modo pratico per risolvere il problema. Grazie!
Jonathan Benn,

66

se hai usato

git rm filename

per eliminare un file quindi

git checkout path/to/filename

non funziona, quindi in quel caso

git checkout HEAD^ path/to/filename

dovrebbe funzionare


2
Mi piace questa risposta. Non c'è dubbio che stai influenzando solo il file specifico che hai rimosso. 1) git checkout path / to / nomefile 2) git checkout - percorso / to / nomefile
Ed of the Mountain

Eccellente. git checkout HEAD^ path/to/filenameha funzionato per me poiché non avevo eseguito il commit del file.
Moses Ndeda,

29

Ecco il comando che mi ha aiutato sul mio mac. Ho provato alcune delle altre soluzioni ma non hanno funzionato per me.

Versione Git su OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Comando

git checkout HEAD -- path/to/file/file.cc



17

Se si desidera ripristinare tutti i file contemporaneamente

Ricorda di usare il punto perché dice a git di afferrare tutti i file.

Questo comando resetterà la testa e metterà in scena tutte le modifiche:

$ git reset HEAD . 

Quindi eseguilo per ripristinare tutti i file:

$ git checkout .

Quindi facendo uno stato git, otterrai:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Questa è la soluzione più semplice e funziona per un mucchio di file (supponiamo che tu abbia eliminato più file / cartelle). buon lavoro amico +
Gkiokan

9

Puoi vedere questo

questo vale per i casi in cui hai usato

git checkout -- .

prima di commettere qualcosa.

Potresti anche voler eliminare i file creati che non sono stati ancora creati. E tu non li vuoi. Con :

git reset -- .

Non hai segnalato completamente la risposta che hai copiato. In realtà git checkout -- .non aiuta a recuperare i file cancellati ed è equivalente a quello che il richiedente ha provato: git checkout .. La parte che il lavoro possibile è quella che non ha copiato: git checkout <file_path>.
Jean Paul,

6

Ho trovato questo post mentre cercavo le risposte su come cancellare un file che era stato cancellato nella mia directory di lavoro dopo un'unione dal ramo di un altro. Non è stato ancora eseguito alcun commit dopo l'unione. Dal momento che era una fusione in corso, non potevo semplicemente aggiungerlo nuovamente usando:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

Ho dovuto fare un altro passaggio oltre al ripristino per riportare il file:

$ git checkout -- file.cpp

4

Se non hai apportato alcuna modifica, tutto ciò che devi fare è riporre tali modifiche e tornerai all'ultimo commit funzionante.

git stash
git stash clear
git clean 

Metterlo nello stack non è una soluzione. È un trucco.
Robert Dolca,

2
Questa è una buona soluzione perché puoi rimuoverla dalla scorta. Se è un hack o no, è questione di gusti. Tutta l'idea della scorta è un trucco intelligente.
Eino Mäkitalo,

@ EinoMäkitalo felice che possa esserti di aiuto :)
Rick,

Mi piace questo approccio meglio di tutti quelli elencati
ckapilla,

3

se stai cercando una directory eliminata.

 git checkout ./pathToDir/*

3

Ecco diversi casi come riferimento per aiutare gli altri:

Se la cancellazione non è stata eseguita , il comando seguente ripristinerà il file eliminato nella struttura di lavoro.

$ git checkout -- <file>

È possibile ottenere un elenco di tutti i file eliminati nell'albero di lavoro utilizzando il comando seguente.

$ git ls-files --deleted

Se la cancellazione è stata commessa , trova il commit dove è avvenuta, quindi recupera il file da questo commit.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Dovrebbe darti qualcosa del tipo c46e81aa403ecb8a0f7a323a358068345, ora usa commit # qui

$ git checkout <commit>^ -- <file>

Qualcosa del genere: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

Nel caso in cui si stia cercando il percorso del file da ripristinare, il comando seguente visualizzerà un riepilogo di tutti i file eliminati.

$ git log --diff-filter=D --summary

Se vuoi solo visualizzare l'elenco dei file:

git log --diff-filter=D --summary | grep "delete mode"

2

Per me ciò che ha funzionato è stato git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Per esempio git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(eseguito nel ramo in cui vogliamo che il file vada)

Dopo l'esecuzione di quel comando, il file ripristinato esisterà nella posizione originale (che dovrà essere modificato)


e / o semplicemente un git checkout master path/to/the/file.binmodo per ripristinare il file senza perdere altre modifiche che potresti aver fatto. PS: questa dovrebbe essere la risposta accettata ...
Edoardo,

1

Se hai installato ToroiseGIT, seleziona la voce di menu "Ripristina ..." per il menu a comparsa della cartella principale.


1

1.Trova quel particolare commit a cui vuoi ripristinare usando:

   git log
This command will give you a list of commits done by you .

2. Ripristinare tale commit utilizzando:

    git revert <commit id> 

Ora la tua filiale locale avrebbe tutti i file in particolare


Funziona se hai già eseguito le modifiche.
live-love

1

ATTENZIONE: impegnare qualsiasi lavoro che si desidera conservare per primo.

È possibile ripristinare l'area di lavoro (e ripristinare i file eliminati)

git checkout ./*

2
Cordiali saluti ... questo comando ha cancellato tutti i miei file di lavoro e non ha recuperato il file cancellato ... attenzione
hendr1x

Questo è il motivo per cui usi questo comando per ripristinare il tuo spazio di lavoro. Ho pensato che sarebbe stato autoesplicativo.
Henrique Florêncio,

1
Questo comando non funziona perché se il file viene eliminato, non verrà catturato da ./*.
Jean Paul,

@JeanPaul forse sto fraintendendo ma ha messo il mio spazio di lavoro nello stato originale (file cancellato ora presente).
Marc

@Marc Potrebbe funzionare, ma solo se non ci sono file visibili nella directory, perché altrimenti ./*verrà espanso da bash per abbinare quei file prima di essere inviato a Git.
Jean Paul,

0

Ho avuto lo stesso problema, ma nessuna delle soluzioni sopra ha funzionato per me. Quello che ho finito per fare è stato:
- creare un file vuoto con lo stesso nome
- confrontare questo file con la sua cronologia locale
- copiare la cronologia in un file vuoto.


-1

Ho avuto lo stesso problema e nessuna delle risposte qui ho provato ha funzionato anche per me. Sto usando Intellij e ho verificato un nuovo ramo git checkout -b minimalExampleper creare un "esempio minimo" sul nuovo ramo di qualche problema eliminando un gruppo di file e modificandone un altro nel progetto. Sfortunatamente, anche se non ho eseguito il commit di nessuna delle modifiche sul nuovo ramo "esempio minimo", quando ho ricontrollato il mio ramo "originale", tutte le modifiche e le eliminazioni dal ramo "esempio minimo" sono avvenute nel " "ramo originale anche (o così appariva). Secondo git statusi file eliminati erano appena andati da entrambi i rami.

Fortunatamente, anche se Intellij mi aveva avvertito "l'eliminazione di questi file potrebbe non essere completamente recuperabile", sono stato in grado di ripristinarli (sul ramo di esempio minimo da cui erano stati effettivamente eliminati) facendo clic con il pulsante destro del mouse sul progetto e selezionando Cronologia locale > Mostra cronologia (quindi Ripristina sull'elemento cronologico più recente che desideravo). Dopo che Intellij ha ripristinato i file nel ramo "esempio minimo", ho spostato il ramo all'origine. Quindi sono tornato al mio ramo locale "originale" e sono corso git pull origin minimalExamplea recuperarli anche nel ramo "originale".

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.