2010-01-24 4 views
284

J'ai accidentellement dit git rm -r .. Comment puis-je récupérer de cela?Comment faire pour revenir à "git rm -r."?

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 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 ..

+2

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. –

+7

Notez que parce que vous n'avez pas fourni '-f' à' git rm', git n'aura pas supprimé les fichiers qui ont subi des modifications staging ou unstaged donc un 'git reset; git checkout .' devrait tout récupérer. –

+0

Il suffit de regarder - git checkout. effacera tous les changements non mis en scène. – PeterB

Répondre

369
git reset HEAD 

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

git reset --hard HEAD 

devrait tout réinitialiser de force à votre dernière validation. Si vous avez des modifications non validées, mais la première commande ne fonctionne pas, puis enregistrez vos modifications non validées avec git stash:

git stash 
git reset --hard HEAD 
git stash pop 
+17

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. –

+145

ce thread juste empêché une crise cardiaque imminente. –

+8

@Mild: Je porte toujours une sueur froide! – hoipolloi

24

Mise à jour:

Depuis git rm . supprime tous les fichiers dans ce domaine 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 tu veux. Cela n'affecte pas les dossiers parents de votre code ou index extrait.


Vieille réponse qui n'a pas été:

reset HEAD 

fera l'affaire, et n'efface aucune modification non validée que vous avez apportées à vos fichiers. Ensuite, vous devez répéter toutes les commandes git add que vous avez mises en file d'attente.

+0

'co' est' checkout' – DanSkeel

+1

désolé, je configure toujours 'git alias .co = "checkout" 'de sorte que' git co' fasse checkout. –

196

Je git-rm'd quelques fichiers et a continué d'apporter des modifications avant mon prochain commit quand J'ai réalisé que j'avais besoin de certains de ces fichiers. Au lieu de planque et remettre, vous pouvez simplement la caisse 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 intacte sans solutions de contournement.

+3

Cela a aidé parce que j'avais d'autres changements non validés. – Dan

+8

Ceci est la meilleure réponse, IMO. M'a sauvé. – sudo

+1

Cette réponse aide ceux d'entre nous qui ont trébuché sur cette question en cherchant à inverser un seul 'git rm' plutôt qu'un' git rm -r' récursif entier. Pour une suppression récursive complète, les autres solutions peuvent être meilleures, en fonction du nombre de fichiers supprimés. – tresf

18

Si vous vous retrouvez avec aucun des travail 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 #> 
+1

vous m'avez sauvé – Bear

+0

4 ans plus tard, encore une bouée de sauvetage! – ThievingSix

+0

Est-ce que l'astuce! –

38

Pour retrouver certains fichiers ou dossiers, on peut utiliser le

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

Ce sera 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, à savoir HEAD.

Indice: On peut passer un hachage de validation aux deux commandes pour recréer des fichiers à partir d'une ancienne validation. Voir git reset --help et git checkout --help pour plus de détails.

7

Il y a quelques bonnes réponses déjà, mais je pourrais penser un peu utilisé une syntaxe non seulement fonctionne très bien, mais est très explicite dans ce que vous voulez (celui-ci ne fait pas peur ou mystérieux)

git checkout <branch>@{"20 minutes ago"} <filename> 
0

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

git checkout -- . 
9

Si vous avez commis et poussé les changements, 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 
+4

C'est le seul qui a fonctionné! Merci – smac89

+2

Je ne ... je n'ai même pas les mots. Monsieur, je voudrais vous acheter un KEG. – motleydev

+0

Cela a fonctionné pour 'Changes to be committed:' où ​​un fichier a été supprimé d'un vieux git cherry-pick dont j'avais encore besoin. J'avais essayé git reset HEAD ~ qui ne fonctionnait pas. – mushcraft

-1

j'avais exactement la même question: nettoyais mes dossiers, réorganiser et déplacer des fichiers. Je suis entré: git rm . et appuyez sur Entrée; et puis senti mes entrailles se desserrer un peu. Heureusement, je n'ai pas tapé git commit -m "" tout de suite.

Cependant, la commande suivante

git checkout . 

de tout restauré et sauvé ma vie.

3

Obtenir la liste commit

git log --oneline 

Par exemple, commettras Stable a hachage: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

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

cela a fonctionné pour moi merci –

1

undo 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.

+0

Bien sûr, rien ne peut annuler 'git rm -rf', car cela peut également supprimer les fichiers non-suivis ou mis en scène (seulement). – jpaugh

+0

'git rm -rf file' et' git rm -rf dir' ne supprimeront aucun fichier non suivi. –

Questions connexes