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


Answers

  1. Utilisez git log --diff-filter=D --summary pour obtenir tous les commits qui ont supprimé les fichiers et les fichiers supprimés;
  2. Utilisez git checkout $commit~1 filename de git checkout $commit~1 filename pour restaurer le fichier supprimé.
Question

Dites que je suis dans un dépôt Git. Je supprime un fichier et valide ce changement. Je continue à travailler et à faire plus de commits. Ensuite, je trouve que j'ai besoin de restaurer ce fichier.

Je sais que je peux extraire un fichier en utilisant git checkout HEAD^ foo.bar , mais je ne sais pas vraiment quand ce fichier a été supprimé.

  1. Quel serait le moyen le plus rapide pour trouver le commit qui a supprimé un nom de fichier donné?
  2. Quel serait le moyen le plus simple de récupérer ce fichier dans ma copie de travail?

J'espère ne pas avoir à parcourir manuellement mes journaux, à extraire l'ensemble du projet pour un SHA donné, puis à copier manuellement ce fichier dans ma caisse d'origine.




Dans de nombreux cas, il peut être utile d'utiliser coreutils (grep, sed, etc.) en conjonction avec Git. Je connais déjà très bien ces outils, mais Git moins. Si je voulais faire une recherche pour un fichier supprimé, je ferais ce qui suit:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Quand je trouve la révision / commit:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Juste comme d'autres l'ont dit avant moi.

Le fichier sera maintenant restauré à l'état qu'il avait avant la suppression. Souvenez-vous de le re-commettre à l'arbre de travail si vous voulez le garder.




J'ai cette solution .

  1. Obtenez l'ID de la validation où le fichier a été supprimé en utilisant l'une des méthodes ci-dessous.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # recommandé si vous vous souvenez de rien
  2. Vous devriez obtenir quelque chose comme:

commettre bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Auteur: Alexander Orlov Date: Jeudi 12 mai 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commettre 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Auteur: Alexander Orlov Date: Jeudi 12 mai 22:10:22 2011 +0200

3 . Maintenant, en utilisant le commit id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 faire:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Comme l'identifiant de validation fait référence à la validation où le fichier a déjà été supprimé, vous devez référencer le commit juste avant bfe68b, ce que vous pouvez faire en ajoutant ^1 . Cela signifie: donnez-moi le commit juste avant bfe68b.




Dans notre cas, nous avons accidentellement supprimé des fichiers dans un commit et certains commit plus tard, nous avons réalisé notre erreur et nous voulions récupérer tous les fichiers qui ont été supprimés mais pas ceux qui ont été modifiés.

Basé sur l'excellente réponse de Charles Bailey voici mon seul paquebot:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)



Mon nouvel alias préféré, basé sur la answer bonyiii (upvoted), et ma propre réponse à propos de " Passer un argument à une commande Git alias ":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

J'ai perdu un fichier, effacé par erreur il y a quelques mois?
Rapide:

git restore my_deleted_file

Crise évitée.

Robert Dailey propose dans les commentaires l'alias suivant:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

Et jegan ajoute dans les commentaires :

Pour définir l'alias à partir de la ligne de commande, j'ai utilisé cette commande:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 



J'ai eu la même question. Sans le savoir, j'avais créé un commit qui pendait .

Liste dengling commits

git fsck --lost-found

Inspecter chaque commit qui pend

git reset --hard <commit id>

Mes fichiers ont réapparu lorsque je suis passé au commit qui pend.

git status pour la raison:

“HEAD detached from <commit id where it detached>”




Pour restaurer un fichier supprimé et validé:

git reset HEAD some/path
git checkout -- some/path

Il a été testé sur Git version 1.7.5.4.




Je suis venu à cette question en cherchant à restaurer un fichier que je viens de supprimer mais je n'avais pas encore engagé le changement. Juste au cas où vous vous trouvez dans cette situation, tout ce que vous devez faire est le suivant:

git checkout HEAD -- path/to/file.ext




J'ai donc dû restaurer un tas de fichiers supprimés d'un commit spécifique et je l'ai géré avec deux commandes:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Notez l'espace de fin à la fin de chaque commande.)

Les fichiers avaient été ajoutés au fichier .gitignore, puis effacés avec git rm, j'avais besoin de restaurer les fichiers mais de les démonter. J'avais des centaines de fichiers à restaurer, en tapant des choses manuellement pour chaque fichier, car dans les autres exemples, c'était beaucoup trop lent.






Related