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


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 vérifier 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.


2382
2018-06-04 22:40


origine


Réponses:


Trouvez 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ée.

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

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

git checkout <deleting_commit>^ -- <file_path>

Ou dans une commande, si $file est le fichier en question.

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

Si vous utilisez zsh et que l'option EXTENDED_GLOB est activée, le symbole du caret ne fonctionnera pas. Vous pouvez utiliser ~1 au lieu.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

2718
2017-07-11 07:12



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

$commit est la valeur de la validation que vous avez trouvée à l'étape 1, par ex. e4cf499627


723
2018-06-04 23:10



Pour restaurer tous les fichiers supprimés dans un dossier, entrez la commande suivante.

git ls-files -d | xargs git checkout --

301
2017-12-02 06:11



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


99
2018-04-10 00:03



Si vous êtes fou, utilisez git-bisect. Voici ce qu'il faut faire:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Il est maintenant temps d'exécuter le test automatisé. La commande shell '[ -e foo.bar ]' retournera 0 si foo.bar existe, et 1 sinon. La commande "run" de git-bisect utilisera la recherche binaire pour trouver automatiquement la première validation où le test échoue. Il commence à mi-chemin dans la plage donnée (de bon à mauvais) et le réduit de moitié en fonction du résultat du test spécifié.

git bisect run '[ -e foo.bar ]'

Maintenant vous êtes au commit qui l'a supprimé. De là, vous pouvez revenir à l'avenir et utiliser git-revert pour annuler le changement,

git bisect reset
git revert <the offending commit>

ou vous pouvez revenir en arrière un commit et inspecter manuellement les dommages:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

82
2018-06-04 22:46



Mon nouvel alias préféré, basé sur Bonyiiide répondre (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\"" 

61
2018-02-17 15:33



Si vous connaissez le nom de fichier, c'est un moyen facile avec les commandes de base:

Liste toutes les validations pour ce fichier.

git log -- path/to/file

Le dernier commit (le plus haut) est celui qui a supprimé le fichier. Vous devez donc restaurer l'avant-dernier commit.

git checkout {second to last commit} -- path/to/file

42
2018-02-27 01:50



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.


27
2017-07-04 04:39



Si vous avez seulement fait des changements et supprimé un fichier, mais pas le commettre, et maintenant vous avez rompu avec vos changements

git checkout -- .

mais vos fichiers supprimés ne sont pas retournés, vous faites simplement la commande suivante:

git checkout <file_path>

Et hop, votre fichier est de retour.


21
2017-09-02 15:30



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* # recommandé si vous avez à peine se souvenir de tout
  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 référence le commit 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.


20
2018-03-01 10:48



git checkout /path/to/deleted.file

13
2018-06-25 19:40