git récupérer le fichier supprimé où aucun commit n'a été fait après la suppression


812

J'ai supprimé certains fichiers.

Je ne me suis PAS encore engagé.

Je veux réinitialiser mon espace de travail pour récupérer les fichiers.

J'ai fait un git checkout ..

Mais les fichiers supprimés sont toujours manquants.

Et git statusmontre:

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

Pourquoi ne git checkout .réinitialise- t-il pas l'espace de travail HEAD?


16
si vous n'aviez pas organisé vos modifications après la suppression, cela git checkout .aurait bien fonctionné.
faizal

10
@faizal et vous perdrez vos modifications si vous le faites.
Vasiliy Yorkin

1
Appuyez simplement sur Ctrl-J dans git gui sur l'élément supprimé.
ajeh

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

Voir cette réponse: quora.com/…
live-love

Réponses:


787

La sortie vous indique ce que vous devez faire. git reset HEAD cc.propertiesetc.

Cela interrompra l'opération rm. Après cela, relancer un git statusvous dira que vous devez faire un git checkout -- cc.propertiespour récupérer le fichier.

Mise à jour: je l'ai dans mon fichier de configuration

$ git config alias.unstage
reset HEAD

que j'utilise habituellement pour mettre en scène des trucs.


5
Comment procédez-vous pour plusieurs fichiers supprimés? Exécuter git reset HEAD <<nomfichier>> plusieurs fois serait fastidieux, un moyen efficace de le faire?
SubSul

70
git reset HEAD \*puisgit checkout -- .
Noufal Ibrahim

3
mais j'ai modifié des fichiers.
Jiang YD

@RauliRajande Il est probable que votre situation soit différente de celle décrite dans la question d'origine.
Noufal Ibrahim

1
rm -r ./engines- Oops. Maintenant git reset engines; git checkout engines.
Kris

209

Vous avez organisé la suppression, vous devez donc:

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

git checkout . extrait uniquement de l'index où la suppression a déjà été effectuée.


177

Fais juste git checkout path/to/file-I-want-to-bring-back.txt


8
ne fonctionne que si les fichiers n'ont pas été validés et poussés.
mahen3d

23
Cela n'a pas fonctionné pour moi, git a dit qu'il ne connaissait aucun fichier de ce nom, bien que le fichier soit suivi. Je ne me suis pas engagé non plus, j'ai seulement supprimé un fichier en utilisant le menu contextuel de Netbeans par erreur.
Zelphir Kaltstahl

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

@ user3479125 Je suppose que votre fichier n'a jamais été validé. Qu'en git statusdit-on?
ki92

12
Le statut Git a montré que le fichier "delated file.ext" vert a git checkout HEAD -- file.extaidé à le restaurer.
Ivan Borshchov

144

Pour récupérer toutes les suppressions non mises en scène à la fois, automatiquement, sans spécifier chaque chemin unique:

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

Pour récupérer tous mis en scène des suppressions à la fois, automatiquement, sans spécifier chaque chemin unique:

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

12
J'ai accidentellement supprimé plus de 500 fichiers et cela a fonctionné car il a également conservé toutes mes modifications valides (la première ligne est celle que j'ai utilisée). Merci.
Guy Lowe

1
Suppression accidentelle de tout le contenu d'un dépôt immédiatement après une construction réussie. La première commande a sauvé mon bacon.
MonaLisaOverdrive

2
Avant que cela fonctionne pour moi, je devais courir git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn

1
Très utile, voulait garder les fichiers non suivis mais se débarrasser des fichiers supprimés et modifiés, il suffit de changer -d en -m pour gérer les fichiers modifiés.
RaisinBranCrunch

5
Notez que cela ne fonctionne pas si vous avez des espaces dans vos noms / chemins de fichiers. Je pense que git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --cela fonctionnera.
persil72

79

Puisque vous faites un git checkout . , il semble que vous essayez de restaurer votre branche au dernier état de validation.

Vous pouvez y parvenir avec un git reset HEAD --hard

Attention

Cela peut supprimer toutes vos dernières modifications et annuler vos modifications, par exemple, vous pouvez perdre du travail. C'est peut- être ce que vous voulez, mais consultez les documents pour vous en assurer.


39
Woww !! Attention à ça !!!! Vous avez peut-être raison, mais quelqu'un pourrait être confus et faire exploser tout son code. Ce serait cool si vous ajoutez un plus grand avertissement.
santiagobasulto

3
C'est exactement ce dont j'avais besoin. Ne fait pas exploser tout votre code - vous ramène simplement à votre commit le plus récent.
Andrew Hendrie

2
Je me suis retrouvé avec des centaines de fichiers manquants à un moment donné. C'est le seul moyen pratique de résoudre le problème. Merci!
Jonathan Benn

66

si vous avez utilisé

git rm filename

supprimer un fichier puis

git checkout path/to/filename

ne fonctionne pas, donc dans ce cas

git checkout HEAD^ path/to/filename

devrait marcher


2
J'aime cette réponse. Il ne fait aucun doute que vous n'affectez que le fichier spécifique que vous avez supprimé. 1) git checkout chemin / vers / nom de fichier 2) git checkout - chemin / vers / nom de fichier
Ed of the Mountain

Excellent. git checkout HEAD^ path/to/filenametravaillé pour moi car je n'avais pas validé le dossier.
Moses Ndeda

29

Voici la commande qui m'a aidé sur mon mac. J'ai essayé quelques autres solutions mais elles n'ont pas fonctionné pour moi.

Version Git sur OSX Mavericks

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

Commander

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



17

Si vous souhaitez restaurer tous les fichiers en même temps

N'oubliez pas d'utiliser le point car il indique à git de récupérer tous les fichiers.

Cette commande réinitialisera la tête et annulera toutes les modifications:

$ git reset HEAD . 

Exécutez ensuite ceci pour restaurer tous les fichiers:

$ git checkout .

Ensuite, en faisant un statut git, vous obtiendrez:

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

C'est un peu la solution la plus simple et fonctionne pour un tas de fichiers (disons que vous avez supprimé plusieurs fichiers / dossiers). bon mec de travail +
Gkiokan

9

Voulez-vous voir ça

cela vaut pour les cas où vous avez utilisé

git checkout -- .

avant de commettre quelque chose.

Vous pouvez également vouloir vous débarrasser des fichiers créés qui n'ont pas encore été créés. Et vous n'en voulez pas. Avec :

git reset -- .

Vous n'avez pas rapporté entièrement la réponse que vous avez copiée. En fait git checkout -- .ne contribue pas à récupérer des fichiers supprimés et est équivalent à ce que le demandeur a essayé: git checkout .. La partie qui peut travailler est celui que vous n'avez pas copié: git checkout <file_path>.
Jean Paul

6

J'ai trouvé ce message en recherchant des réponses sur la façon de supprimer un fichier qui a été supprimé dans mon répertoire de travail après une fusion d'une autre branche. Aucun commit n'a encore été effectué après la fusion. Puisqu'il s'agissait d'une fusion en cours, je ne pouvais pas simplement l'ajouter en utilisant:

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

J'ai dû faire une autre étape en plus de la réinitialisation pour ramener le fichier:

$ git checkout -- file.cpp

4

Si vous n'avez effectué aucune modification, tout ce que vous avez à faire est de les cacher et vous reviendrez à la dernière validation en cours.

git stash
git stash clear
git clean 

Le mettre sur la pile de stockage n'est pas une solution. C'est un hack.
Robert Dolca

2
C'est une bonne solution car vous pouvez le retirer de la cachette. Si c'est un hack ou pas, c'est une question de goût. Toute idée de cachette est un hack intelligent.
Eino Mäkitalo

@ EinoMäkitalo heureux que cela puisse vous être utile :)
Rick

J'aime le mieux cette approche
ckapilla

3

si vous recherchez un répertoire supprimé.

 git checkout ./pathToDir/*

3

Voici différents cas comme référence pour aider les autres:

Si la suppression n'a pas été validée , la commande ci-dessous restaurera le fichier supprimé dans l'arborescence de travail.

$ git checkout -- <file>

Vous pouvez obtenir une liste de tous les fichiers supprimés dans l'arborescence de travail à l'aide de la commande ci-dessous.

$ git ls-files --deleted

Si la suppression a été validée , recherchez la validation à l'endroit où elle s'est produite, puis récupérez le fichier à partir de cette validation.

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

Cela devrait vous donner quelque chose comme c46e81aa403ecb8a0f7a323a358068345, maintenant utilisez commit # ici

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

Quelque chose comme ça: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

Dans le cas où vous recherchez le chemin du fichier à récupérer, la commande suivante affichera un résumé de tous les fichiers supprimés.

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

Si vous souhaitez simplement afficher la liste des fichiers:

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

2

Pour moi, ce qui a fonctionné git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Par exemple git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(exécuté dans la branche dans laquelle nous voulons que le fichier aille)

Après l'exécution de cette commande, le fichier restauré existera à l'emplacement d'origine (qui devra être comité)


et / ou tout simplement git checkout master path/to/the/file.binpour que vous restituiez simplement ce fichier sans perdre tout autre changement que vous auriez pu faire. PS: cela devrait être la réponse acceptée ...
Edoardo

1

Si vous avez installé ToroiseGIT, sélectionnez simplement l'élément de menu "Revert ..." pour le menu contextuel du dossier parent.


1

1.Trouvez le commit auquel vous souhaitez revenir en utilisant:

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

2.Retournez à ce commit en utilisant:

    git revert <commit id> 

Maintenant, votre branche locale aurait tous les fichiers en particulier


Cela fonctionne si vous avez déjà validé vos modifications.
live-love

1

ATTENTION: engagez tout travail que vous souhaitez conserver en premier.

Vous pouvez réinitialiser votre espace de travail (et récupérer les fichiers supprimés)

git checkout ./*

2
Pour info ... cette commande a supprimé tous mes fichiers de travail et n'a pas récupéré le fichier supprimé .. attention
hendr1x

C'est pourquoi vous utilisez cette commande pour réinitialiser votre espace de travail. Je pensais que ce serait explicite.
Henrique Florêncio

1
Cette commande ne fonctionne pas car si le fichier est supprimé, il ne sera pas détecté ./*.
Jean Paul

@JeanPaul peut-être que je me méprends, mais cela a mis mon espace de travail dans son état d'origine (le fichier supprimé est maintenant présent).
Marc

@Marc Cela pourrait fonctionner mais seulement s'il n'y a pas de fichier visible dans le répertoire, car sinon ./*il sera développé par bash pour correspondre à ces fichiers avant d'être envoyé à git.
Jean Paul

0

J'ai eu le même problème mais aucune des solutions ci-dessus n'a fonctionné pour moi. J'ai fini par faire:
- créer un fichier vide du même nom
- comparer ce fichier avec son historique local
- copier l'historique dans un fichier vide.


-1

J'ai eu le même problème et aucune des réponses que j'ai essayées ici n'a fonctionné pour moi non plus. J'utilise Intellij et j'avais vérifié une nouvelle branche git checkout -b minimalExamplepour créer un "exemple minimal" sur la nouvelle branche d'un problème en supprimant un tas de fichiers et en modifiant un tas d'autres dans le projet. Malheureusement, même si je n'ai validé aucune des modifications sur la nouvelle branche "exemple minimal", lorsque j'ai extrait ma branche "d'origine" à nouveau, toutes les modifications et suppressions de la branche "exemple minimal" se sont produites dans la " branche "originale" (ou du moins c'est apparu). Selongit status les fichiers supprimés, les deux branches venaient de disparaître.

Heureusement, même si Intellij m'avait prévenu "la suppression de ces fichiers peut ne pas être entièrement récupérable", j'ai pu les restaurer (sur la branche d'exemple minimale à partir de laquelle ils avaient été supprimés) en cliquant avec le bouton droit sur le projet et en sélectionnant l'historique local > Afficher l'historique (puis restaurer sur l'élément d'historique le plus récent que je voulais). Après qu'Intellij a restauré les fichiers dans la branche "exemple minimal", j'ai poussé la branche à l'origine. Ensuite, je suis revenu à ma branche locale "d'origine" et j'ai couru git pull origin minimalExamplepour les récupérer également dans la branche "d'origine".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.