Comment rétablir un "git rm-r."?

j'ai accidentellement dit git rm -r . . Comment puis-je récupérer?

je n'ai pas commis.

je pense que tous les fichiers ont été marqués pour suppression et ont également été physiquement retirés de ma caisse locale.

EDIT: je pourrais (si je connaissais la commande) revenir à la dernière propagation. Mais ce serait beaucoup mieux si je pouvais juste défaire le git rm -r . . Parce que je ne suis pas vraiment sûr de ce que j'ai fait après le dernier commit et avant le git rm -r . .

311
demandé sur BuZZ-dEE 2010-01-24 05:47:30

11 réponses

git reset HEAD

devrait le faire. Si vous n'avez aucun changement non engagé qui vous intéresse, alors

git reset --hard HEAD

devrait réinitialiser de force tout à votre dernière commit. Si vous avez des modifications non-engagées, mais que la première commande ne fonctionne pas, Enregistrez vos modifications non-engagées avec git stash :

git stash
git reset --hard HEAD
git stash pop
398
répondu Brian Campbell 2010-01-24 02:56:49

j'ai git-rmé quelques fichiers et j'ai continué à faire des changements avant ma prochaine propagation quand j'ai réalisé que j'avais besoin de récupérer certains de ces fichiers. Plutôt que de stocker et réinitialiser, vous pouvez simplement vérifier les fichiers individuels que vous avez manqués / supprimé si vous voulez:

git checkout HEAD path/to/file path/to/another_file

cela laisse vos autres changements non engagés intacts sans aucune solution de rechange.

212
répondu Jaime Bellmyer 2016-11-17 19:41:26

pour récupérer quelques fichiers ou dossiers simples on peut utiliser le suivant

git reset -- path/to/file
git checkout -- path/to/file

cela va d'abord recréer les entrées de l'index pour path/to/file et recréer le fichier tel qu'il était dans la dernière propagation, i.e. HEAD .

indice: on peut passer un hachage de propagation aux deux commandes pour recréer des fichiers à partir d'une propagation plus ancienne. Pour plus de détails, voir git reset --help et git checkout --help .

45
répondu Arne L. 2013-01-19 14:54:06

mise à jour:

depuis que git rm . supprime tous les fichiers dans ce répertoire et les répertoires enfants dans la caisse de travail ainsi que dans l'index, vous devez annuler chacun de ces changements:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

cela devrait faire ce que vous voulez. Il n'affecte pas les dossiers parents de votre code ou de votre index.


Vieille réponse qui n'était pas:

reset HEAD

fera l'affaire, et n'effacera aucune modification non engagée que vous avez apportée à vos fichiers.

après cela, vous devez répéter toutes les commandes git add que vous aviez placées en file d'attente.

24
répondu Alex Brown 2012-06-14 22:53:23

si vous n'avez aucune des réponses ci-dessus, vous pourriez être en mesure de récupérer des données en utilisant la suggestion d'ici: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>
22
répondu Skippy VonDrake 2012-11-28 17:39:23

si vous avez engagé et poussé les modifications, vous pouvez le faire pour récupérer le fichier

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file
9
répondu Cory Danielson 2015-01-29 21:49:01

il y a déjà quelques bonnes réponses, mais je pourrais suggérer une syntaxe peu utilisée qui non seulement fonctionne bien, mais est très explicite dans ce que vous voulez (donc pas effrayant ou mystérieux)

git checkout <branch>@{"20 minutes ago"} <filename>
7
répondu mehtunguh 2013-09-28 17:00:13

annuler git rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

undo git rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

undo git rm-rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changes comprend not staged changes , staged changes but not committed .

4
répondu song xu 2018-02-06 03:06:57

Obtenir la liste s'engager

git log  --oneline

par exemple, stable commit a le hash: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master
3
répondu Do Nhu Vy 2016-09-30 13:37:48

j'ai eu une situation identique. Dans mon cas, la solution était:

git checkout -- .
0
répondu Artur 2014-08-14 11:11:47

j'avais exactement le même problème: je nettoyais mes dossiers, Je réorganisais et je déplaçais les fichiers. Je suis entré: git rm . et frapper entrer; et puis senti mes intestins se desserrent un peu. Heureusement, je n'ai pas tapé git commit-m "" tout de suite.

cependant, la commande suivante

git checkout .

a tout restauré, et m'a sauvé la vie.

-1
répondu Wai-Ming Lee 2016-07-27 10:09:49