432 votes

Comment revenir sur un "git rm -r ." ?

J'ai dit accidentellement git rm -r . . Comment puis-je m'en remettre ?

Je ne me suis pas engagé.

Je pense que tous les fichiers ont été marqués pour être supprimés et ont également été physiquement supprimés de ma caisse locale.

EDIT : Je pourrais (si je connaissais la commande) revenir au dernier commit. Mais ce serait bien mieux si je pouvais juste annuler la 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 . .

3 votes

Pour cette question particulière, reset --hard est une bonne solution... elle est déjà listée donc je vais juste mentionner dans ce commentaire que vous pourriez vouloir vérifier la documentation de git-reflog.

9 votes

Notez que parce que vous n'avez pas fourni -f à git rm git n'aura pas supprimé les fichiers contenant des modifications staged ou unstaged. git reset; git checkout . devrait tout récupérer.

1 votes

Faites attention - git checkout . effacera tous les changements non indexés.

518voto

Brian Campbell Points 101107
git reset HEAD

Il faut le faire. Si vous n'avez pas de modifications non validées qui vous intéressent, alors

git reset --hard HEAD

devrait forcer la réinitialisation de tout à votre dernier commit. Si vous avez des modifications non commises, mais que la première commande ne fonctionne pas, alors sauvegardez vos modifications non commises avec git stash :

git stash
git reset --hard HEAD
git stash pop

27 votes

Notez que git reset --hard HEAD détruit toutes les modifications utiles que vous avez faites dans les répertoires parents du répertoire de travail actuel.

13 votes

@Mild : J'en ai encore des sueurs froides !

9 votes

Je n'ai pas voté, mais je viens d'essayer de cacher, de réinitialiser, de pop et j'ai perdu tous mes changements récents. Peut-être que j'ai mal lu la réponse.

276voto

Jaime Bellmyer Points 13815

J'ai fait un git-rm sur quelques fichiers et j'ai continué à faire des changements avant mon prochain commit quand j'ai réalisé que j'avais besoin de récupérer certains de ces fichiers. Plutôt que de cacher et de réinitialiser, vous pouvez simplement vérifier les fichiers individuels que vous avez manqués/enlevés si vous le souhaitez :

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

Cela laisse vos autres modifications non validées intactes sans solution de contournement.

9 votes

Cela m'a aidé car j'avais d'autres changements non validés.

4 votes

Cette réponse est utile pour ceux d'entre nous qui sont tombés sur cette question en cherchant à rétablir un seul git rm au lieu d'un système récursif complet git rm -r . Pour une suppression récursive complète, les autres solutions peuvent être meilleures, en fonction de la quantité de fichiers supprimés.

64voto

Arne L. Points 123

Pour récupérer certains fichiers ou dossiers, on peut utiliser les méthodes suivantes

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

Cela va d'abord recréer les entrées d'index pour path/to/file et recréer le fichier tel qu'il était lors du dernier commit, c'est-à-dire HEAD .

Un conseil : on peut passer un hash de commit aux deux commandes pour recréer des fichiers à partir d'un commit plus ancien. Voir git reset --help et git checkout --help pour les détails.

0 votes

Meilleure réponse. Annulation chirurgicale facile d'un seul git rm sans effacer les autres modifications non validées.

2 votes

Ça m'a aidé ! Meilleure réponse.

31voto

Alex Brown Points 15776

Mise à jour :

Depuis git rm . supprime tous les fichiers de ce répertoire et des répertoires enfants dans l'extraction de travail ainsi que dans l'index, vous devez annuler chacune de ces modifications :

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. Elle n'affecte pas les dossiers parents de votre code ou de votre index extrait.


Une vieille réponse qui ne l'était pas :

reset HEAD

fera l'affaire, et n'effacera pas les changements non validés que vous avez fait à vos fichiers.

après cela, vous devez répéter tout git add les commandes que vous aviez mises en attente.

1 votes

Désolé, je configure toujours git alias.co="checkout" de sorte que git co fait la caisse.

29voto

Skippy VonDrake Points 152

Si aucune des méthodes ci-dessus ne fonctionne, vous pouvez peut-être récupérer les données en utilisant la suggestion suivante : http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

1 votes

4 ans plus tard, toujours un sauveur de vies !

1 votes

J'ai écrit un programme c++ pour concaténer les résultats (j'avais une centaine d'objets en suspens dans mon repo, ce qui rendait cette opération nécessaire). Il suffit de compiler et d'exécuter, puis de passer dans le répertoire local de votre repo git. raw.githubusercontent.com/bluuman/git-recover-files/master/

0 votes

C'est une bonne méthode, après avoir exécuté la git prune -n j'ai plusieurs lignes, ces lignes sont soit tree ou blob ou commit et je remplis toute la chaîne de hachage de blob et j'essaie d'utiliser la deuxième commande pour git cat-file -p <blob #> et je n'arrive toujours pas à retrouver le fichier perdu. Ma situation est assez simple, j'ai créé un nouveau fichier nommé a.cpp et j'ajoute ce fichier à l'index, et plus tard j'utilise la fonction git rm -f pour supprimer ce fichier, et je vois que a.cpp se perdre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X