web-dev-qa-db-fra.com

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

J'ai supprimé tout le contenu d'un dossier et celui-ci est vide. J'avais toujours une copie dans mon dépôt distant. Mais quand j'ai fait un git pull Cela n'a pas remis les fichiers supprimés n'est-ce pas supposé faire ça?

J'ai donc fait des recherches et vu que vous pouvez restaurer 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?

66
json2021

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'arbre 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'intégralité de l'arborescence de travail (pas un seul dossier), mais perdez toutes les modifications non validées

git reset --hard HEAD

Lorsque des fichiers sont supprimés dans certains commit dans le passé:

Trouver le dernier commit qui a affecté le chemin donné. Comme le fichier n'est pas dans la validation HEAD, cette validation doit l'avoir supprimé.

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

Puis vérifiez la version à la validation avant, en utilisant le curseur (^) symbole:

git checkout <deleting_commit>^ -- <file_path>

Restaurer l'arbre de travail complet depuis un commit distant

git reset --hard <revision> 
182
Nick Volynkin

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 voulez annuler toutes les modifications faites:

git reset --hard HEAD
5
Ivan Mushketyk

La seule chose qui a fonctionné pour moi a été de récupérer le dépôt dans un autre dossier. Supposons que le dépôt actuel soit 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/temp et fais ce que je veux. Par exemple

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

Maintenant, je peux copier le dossier 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 FONCTIONNE 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 destructifs au-delà des fichiers supprimés. Tout autre changement sera également perdu.

De même

git reset --hard some-commit

perdra tous les commits après some-commit

2
gman

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

La raison pour laquelle pull ne restaure pas les fichiers est que git considère vos suppressions comme la modification la plus récente, et l'applique en plus de tout ce que vous extrayez.

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

0
lostphilosopher