Question Git: Comment trouver un fichier supprimé dans l'historique de validation du projet?


Il était une fois, il y avait un fichier dans mon projet que j'aimerais maintenant pouvoir obtenir.

Le problème est: je n'ai aucune idée de quand l'ai-je supprimé et sur quel chemin était-il.

Comment puis-je localiser les validations de ce fichier lorsqu'il existait?


856
2017-08-26 10:43


origine


Réponses:


Si vous ne connaissez pas le chemin exact que vous pouvez utiliser

git log --all --full-history -- **/thefile.*

Si vous connaissez le chemin du fichier, vous pouvez le faire:

git log --all --full-history -- <path-to-file>

Cela devrait montrer une liste de commits dans toutes les branches qui ont touché ce fichier. Ensuite, vous pouvez trouver la version du fichier que vous voulez, et l'afficher avec ...

git show <SHA> -- <path-to-file>

Ou restaurez-le dans votre copie de travail avec:

git checkout <SHA>^ -- <path-to-file>

Notez le symbole du caret (^), qui obtient la caisse avant à celui identifié, parce qu'au moment de <SHA> commettre le fichier est supprimé, nous devons regarder le commit précédent pour obtenir le contenu du fichier supprimé


1066
2017-08-26 10:46



Obtenir la liste des fichiers supprimés et copier le chemin complet du fichier supprimé

git log --diff-filter=D --summary | grep delete

Exécutez la commande suivante pour trouver l'ID de validation de cette validation et copiez l'ID de validation

git log --all -- FILEPATH

Afficher diff du fichier supprimé

git show COMMIT_ID -- FILE_PATH

Rappelez-vous, vous pouvez écrire la sortie dans un fichier en utilisant > comme

git show COMMIT_ID -- FILE_PATH > deleted.diff

302
2018-02-19 04:53



Impossible d'éditer la réponse acceptée en l'ajoutant comme réponse ici,

pour restaurer le fichier dans git, utilisez ce qui suit (notez le signe '^' juste après le SHA)

git checkout <SHA>^ -- /path/to/file

35
2018-04-03 15:51



@Amber a donné la bonne réponse! Juste un ajout de plus, si vous ne connaissez pas le chemin exact du fichier, vous pouvez utiliser des caractères génériques! Cela a fonctionné pour moi.

git log --all -- **/thefile.*

21
2018-01-08 16:36



Supposons que vous vouliez récupérer un fichier appelé MyFile, mais sont incertains de son chemin (ou de son extension, d'ailleurs):

Préliminaire Évitez la confusion en passant à la racine git

Un projet non trivial peut avoir plusieurs répertoires avec des noms similaires ou identiques.

> cd <project-root>
  1. Trouver le chemin complet

    git log --diff-filter = D - récapitulatif | grep supprimer | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js est le chemin et le fichier que vous cherchez.

  1. Déterminer toutes les validations qui ont affecté ce fichier

    git log --oneline --follow - complet / chemin / vers / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. Commander le fichier

Si vous choisissez le premier commit listé (le dernier chronologiquement, ici bd8374c), le fichier ne sera pas trouvé, puisqu'il a été supprimé dans ce commit.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

Sélectionnez simplement le commit précédent (ajouter un signe):

> git checkout bd8374c^ -- full/path/to/MyFile.js

15
2018-03-03 15:35



Essayez d'utiliser l'un des spectateurs, tels que gitk de sorte que vous pouvez parcourir l'histoire pour trouver ce fichier à moitié mémorisé. (utilisation gitk --all si nécessaire pour toutes les branches)


14
2017-08-26 12:59



Une des choses qui est fastidieuse ici est d'obtenir le chemin du fichier supprimé, donc je viens d'écrire une simple commande, où un utilisateur dev ou git peut passer un nom de fichier supprimé et obtenir l'historique:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

Si quelqu'un, peut améliorer la commande, s'il vous plaît faire.


11
2018-01-30 18:24