web-dev-qa-db-fra.com

Comment retourner un "git rm -r."?

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

350
user89021
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
439
Brian Campbell

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.

237
Jaime Bellmyer

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.

47
Arne L.

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.

27
Alex Brown

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 #>
24
Skippy VonDrake

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
9
Cory Danielson

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.

8
song xu

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

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
3
D Vy

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

git checkout -- .
1
Artur