J'ai accidentellement dit git rm -r .
. Comment puis-je récupérer de cela?
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 au dernier commit. Mais ce serait beaucoup mieux si je pouvais simplement 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 ne vous souciez pas des modifications non validées, alors
git reset --hard HEAD
devrait forcer tout réinitialiser à votre dernier commit. Si vous avez des modifications non validées, mais que la première commande ne fonctionne pas, enregistrez 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 quand j'ai réalisé que j'avais besoin de certains de ces fichiers. Plutôt que de stocker et de réinitialiser, vous pouvez simplement extraire les fichiers que vous avez manqués/supprimé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 rechange.
Pour récupérer des fichiers ou des dossiers individuels, 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 ensuite le fichier tel qu'il était dans le dernier commit, c'est-à-dire .HEAD
.
Hint: on peut passer un hachage de validation aux deux commandes pour recréer les fichiers d'une validation plus ancienne. Voir git reset --help
et git checkout --help
pour plus de détails.
Mise à jour:
Puisque git rm .
supprime tous les fichiers de ce répertoire et des répertoires enfant de la caisse de travail et de 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 vous avez apporté à vos fichiers.
après cela, vous devez répéter toutes les commandes git add
que vous avez mises en attente.
Si vous vous retrouvez avec aucune des solutions ci-dessus, vous pourrez peut-être récupérer des données en utilisant la suggestion suivante: http://www.spinics.net/lists/git/msg62499.html
git Prune -n
git cat-file -p <blob #>
Si vous avez validé 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
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
comprend not staged changes
, staged changes but not committed
.
Il y a déjà quelques bonnes réponses, mais je pourrais suggérer une syntaxe peu utilisée qui non seulement fonctionne très bien, mais qui est très explicite dans ce que vous voulez (donc pas effrayant ni mystérieux)
git checkout <branch>@{"20 minutes ago"} <filename>
Obtenir la liste de validation
git log --oneline
Par exemple, la validation stable a un hachage: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git Push -ff Origin master
J'ai eu une situation identique. Dans mon cas, la solution était:
git checkout -- .