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 .
.
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
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.
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
.
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.
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 #>
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
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>
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
.
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
j'ai eu une situation identique. Dans mon cas, la solution était:
git checkout -- .
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.