Comment rétablir un “git rm -r.”

J’ai accidentellement dit git rm -r . . Comment puis-je me remettre de cela?

Je n’ai pas commis.

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

EDIT: Je pourrais (si je connaissais la commande) revenir à la dernière validation. Mais ce serait beaucoup mieux si je pouvais annuler 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 . .

 git reset HEAD 

Devrait le faire Si vous n’avez pas de modifications non validées qui vous intéressent, alors

 git reset --hard HEAD 

devrait forcément réinitialiser tout à votre dernier commit. Si vous avez des modifications non validées, mais que la première commande ne fonctionne pas, alors sauvegardez vos modifications non validées avec git stash :

 git stash git reset --hard HEAD git stash pop 

J’ai envoyé quelques fichiers et j’ai continué à faire des changements avant mon prochain commit lorsque j’ai réalisé que j’avais besoin de certains de ces fichiers. Plutôt que de cacher et de réinitialiser, vous pouvez simplement extraire les fichiers individuels que vous avez manqués / supprimés si vous voulez:

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

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

Pour récupérer des fichiers ou des dossiers uniques, vous pouvez utiliser les éléments suivants

 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 dans le dernier commit, c’est-à-dire HEAD .

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

Mettre à 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. Cela n’affecte pas les dossiers parents de votre code ou index extrait.


Ancienne réponse qui n’était pas:

 reset HEAD 

fera l’affaire et n’effacera pas les modifications non validées que vous avez apscopes à vos fichiers.

Après cela, vous devez répéter toutes les commandes git add vous avez mises en queue.

Si vous ne vous retrouvez avec aucun des éléments ci-dessus, vous pourrez peut-être récupérer des données à l’aide de la suggestion fournie ici: http://www.spinics.net/lists/git/msg62499.html

 git prune -n git cat-file -p  

Si vous avez engagé et appuyé 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 

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

 git checkout @{"20 minutes ago"}  

Obtenir la liste commit

 git log --oneline 

Par exemple, la validation stable a le hachage: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

 git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81 git push -ff origin master 

annuler git rm

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

annuler git rm -r

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

annuler git rm -rf

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

Uncommitted changes not staged changes Uncommitted changes comprennent not staged changes staged changes but not committed .

J’ai eu une situation identique. Dans mon cas, la solution était:

 git checkout -- . 

J’avais exactement le même problème: nettoyer mes dossiers, réorganiser et déplacer des fichiers. Je suis entré: git rm . et appuyez sur Entrée; et ensuite senti mes intestins se desserrer un peu. Heureusement, je n’ai pas saisi git commit -m “” tout de suite.

Cependant, la commande suivante

 git checkout . 

tout restauré et sauvé ma vie.