Restaurer un dossier supprimé dans un dépôt Git

98

J'ai supprimé tout le contenu d'un dossier et le dossier est vide. J'en avais encore une copie dans mon repo distant. Mais quand j'ai fait un, git pullil n'a pas remis les fichiers supprimés, n'est-ce pas censé le faire?

J'ai donc fait quelques recherches et j'ai vu que vous pouvez rétablir un fichier en faisant git checkout <revision> -- <name of file>

Mais cela ne fonctionne que sur les fichiers.

Comment puis-je récupérer tous les fichiers dans le répertoire?

json2021
la source
1
git statusvous donnera un indice sur la ou les commandes à exécuter
Tavian Barnes
1
Il semble que vous ayez toujours l'ancien répertoire dans votre dépôt distant (et que vous pourriez même l'avoir dans votre dépôt local aussi). SUGGESTION FORTE: 1) Faites un "pull" de votre repo distant dans un NOUVEAU repo (ne faites plus de dégâts à votre repo local). 2) Essayez "checkout" ... ou même "revenez" dans votre nouveau dépôt local: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Mettez à jour le référentiel distant lorsque vous êtes sûr que tout va bien.
paulsm4

Réponses:

245

Tout ce que vous pouvez faire avec un fichier, vous pouvez aussi le faire avec un dossier.

Notez également Rechercher et restaurer un fichier supprimé dans un référentiel Git


Les fichiers sont supprimés de l'arborescence de travail mais pas encore validés:

Si vous n'avez pas encore indexé ( git add) vos modifications, vous pouvez rétablir le contenu d'un répertoire:

git checkout -- path/to/folder

Si la suppression est déjà indexée, vous devez d'abord la réinitialiser:

git reset -- path/to/folder
git checkout -- path/to/folder


Restaurez l'arborescence de travail complète (pas un seul dossier), mais perdez toutes les modifications non validées

git reset --hard HEAD


Lorsque des fichiers ont été supprimés dans un commit dans le passé:

Trouvez le dernier commit qui a affecté le chemin donné. Comme le fichier n'est pas dans le commit HEAD, ce commit doit l'avoir supprimé.

git rev-list -n 1 HEAD -- <file_path>

Ensuite, vérifiez la version lors de la validation avant, en utilisant le ^symbole caret ( ):

git checkout <deleting_commit>^ -- <file_path>


Restaurez l'arbre de travail complet à partir d'un commit distant

git reset --hard <revision> 
Nick Volynkin
la source
1
git checkout -- path/to/folder/* ne fonctionne pas Remarque: la question est de savoir comment restaurer un dossier pas un fichier
gman
@gman How can I retrieve all the files inside the directorysignifie à la fois le répertoire et ses fichiers. Mais la commande ne fonctionne étonnamment pas pour moi aussi. Je me souviens qu'il y a un an.
Nick Volynkin
2
@gman mais ça marche comme git checkout -- pathou git checkout -- 'path/*'. Dans votre exemple, vous supprimez git rmce que l'OP ne semblait pas faire. J'ai ajouté des instructions pour un tel cas. Merci!
Nick Volynkin
3
Sur Windows, vous devez mettre des guillemets comme ceci:git checkout "<deleting_commit>^" -- <file_path>
Maor
Il a désorganisé un tas de choses dans tout le dépôt même si j'ai spécifié un dossier sur la commande de réinitialisation. Comment ça peut vouloir dire quelque chose? Lorsque j'ai exécuté la caisse, il semble que mon dossier a été restauré. Je n'ai aucune idée de ce que unstage a fait au reste de mon code, ah les joies d'un gestionnaire de référentiels peer to peer utilisé pour les dépôts centralisés, soupir.
Paul Kenjora
5

Si vous n'avez pas encore validé vos modifications, vous pouvez rétablir le contenu ou un répertoire:

git checkout -- removed_directory

Si vous souhaitez annuler toutes les modifications, procédez comme suit:

git reset --hard HEAD
Ivan Mushketyk
la source
3
git checkout -- removed_directory ne fonctionne pas
gman
git checkout -- removed_directorya fonctionné pour moi, mais j'ai déjà créé ce répertoire (par l' checkoutun des fichiers de ce répertoire). Après la création, tous les fichiers ont été restaurés dans le dossier par cette commande.
Boolean_Type
3

La seule chose qui a fonctionné pour moi était de récupérer le dépôt dans un autre dossier. Supposons que le dépôt actuel est dans /home/me/current.

J'ai ensuite fait

git clone /home/me/current /home/me/temp

Cela fait un clone séparé du repo dans /home/me/temp

Je peux maintenant aller /home/me/tempet faire ce que je veux. Par exemple

git reset --hard commit-hash-before-delete

Maintenant, je peux recopier le dossier du fichier supprimé

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

Et supprimez le dossier temporaire

rm -rf /home/me/temp

Les exemples de

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

NE FONCTIONNENT PAS

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

D'autres exemples comme

git reset --hard HEAD

sont destructeurs au-delà des fichiers supprimés. Toutes les autres modifications seront également perdues.

De même

git reset --hard some-commit

perdra tous les commits après some-commit

gman
la source
2

Depuis git 2.24.0, il existe une nouvelle commande git expérimentale: git restore

git restore --staged some/deleted/folder
trois
la source
Cela me montre git: 'restore' n'est pas une commande git
Ahmed C
2

Vous pouvez restaurer des fichiers ou un dossier avec git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Ici, master ~ 1 rétablit votre dossier en révision "1" depuis votre branche master.

Source: https://git-scm.com/docs/git-restore

jBelanger
la source
0

Si vous ne spécifiez pas de fichier spécifique, vous devriez être en mesure d'extraire le contenu complet d'un commit spécifique. Comme: git checkout 264794319e9695ba843cd6(en supposant que le hachage a tous vos fichiers dans le bon état).

La raison pullpour laquelle il ne s'agit pas de restaurer des fichiers est que git considère vos suppressions comme le changement le plus récent, en l'appliquant en plus de tout ce que vous tirez.

(Je recommanderais d'expérimenter dans une nouvelle branche.)

philosophe perdu
la source
-1

pour les suppressions non validées, c'est aussi simple que ceci:

git reset HEAD rel / chemin / vers / supprimé / répertoire / *

justadev
la source