file-io récupérer commit - Rechercher et restaurer un fichier supprimé dans un référentiel Git





10 Answers

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

$commit est la valeur du commit que vous avez trouvé à l'étape 1, par exemple e4cf499627

modifications qui ne

Dites que je suis dans un référentiel Git. Je supprime un fichier et valide ce changement. Je continue à travailler et à faire d'autres engagements. Ensuite, je trouve que je dois 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 de 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 devoir parcourir manuellement mes journaux, extraire le projet entier pour un SHA donné, puis copier manuellement ce fichier dans l'extraction de mon projet d'origine.




Je suis venu à cette question cherchant à restaurer un fichier que je viens de supprimer mais je n'avais pas encore validé 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




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

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, supprimé par erreur il y a quelques instants?
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\"" 



Pour restaurer un fichier supprimé et validé:

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

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




J'ai cette solution .

  1. Obtenez l'identifiant 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 à peine de rien
  2. Vous devriez obtenir quelque chose comme:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Auteur: Alexander Orlov Date: jeu 12 mai 23:44:27 2011 +0200

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

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Auteur: Alexander Orlov Date: jeu 12 mai 22:10:22 2011 +0200

3 Maintenant, en utilisant l'id de commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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




Dans de nombreux cas, il peut être utile d’utiliser coreutils (grep, sed, etc.) avec Git. Je connais déjà très bien ces outils, mais Git moins. Si je souhaitais rechercher un fichier supprimé, je procéderais comme 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

Tout comme d'autres l'ont déclaré avant moi.

Le fichier va maintenant être restauré dans l'état où il se trouvait avant la suppression. Pensez à le ré-engager dans l’arbre de travail si vous souhaitez le conserver.




J'ai donc dû restaurer un tas de fichiers supprimés à partir 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, puis de les décomposer. J'avais des centaines de fichiers à restaurer, taper manuellement les choses pour chaque fichier, comme dans les autres exemples, serait beaucoup trop lent.




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

Liste des commits suspendus

git fsck --lost-found

Inspecter chaque commet en suspens

git reset --hard <commit id>

Mes fichiers ont réapparu lorsque je suis passé à la validation en attente.

git status pour la raison:

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




Si vous connaissez la validation qui a supprimé le ou les fichiers, exécutez cette commande où <SHA1_deletion> est la validation qui a supprimé le fichier:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

La partie avant le canal répertorie tous les fichiers supprimés dans la validation; elles sont toutes extraites du commit précédent pour les restaurer.




$ git log --diff-filter=D --summary  | grep "delete" | sort



Related