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

Il était une fois un fichier dans mon projet que j’aimerais maintenant pouvoir obtenir.

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

Comment puis-je localiser les commits de ce fichier lorsqu’il existait?

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

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

Si vous connaissez le chemin d’access du fichier, vous pouvez le faire:

 git log --all --full-history --  

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

 git show  --  

Ou restaurez-le dans votre copie de travail avec:

git checkout ^ --

Notez le symbole caret ( ^ ), qui obtient la vérification avant celle identifiée, car au moment de la validation de le fichier est supprimé, nous devons examiner la validation précédente pour obtenir le contenu du fichier supprimé.

Obtenir une 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 le diff du fichier supprimé

 git show COMMIT_ID -- FILE_PATH 

Rappelez-vous que vous pouvez écrire une sortie dans un fichier en utilisant > like

 git show COMMIT_ID -- FILE_PATH > deleted.diff 

Impossible de modifier 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 ^ -- /path/to/file 

@ Amber a donné une réponse correcte! Encore un ajout, 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.* 

Supposons que vous souhaitiez récupérer un fichier appelé MyFile , mais que vous ne connaissiez pas son chemin (ou son extension d’ailleurs):

Prelim .: Évitez la confusion en allant à la racine de git

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

 > cd  
  1. Trouver le chemin complet

    git log –diff-filter = D –sommaire | 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 recherchez.

  1. Déterminez tous les commits qui ont affecté ce fichier

    git log –oneline –follow – full / path / to / 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 commit de la première liste (le dernier chronologiquement, ici bd8374c), le fichier ne sera pas trouvé, car 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.` 

Il suffit de sélectionner le commit précédent (append a caret):

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

Essayez d’utiliser l’un des gitk , tels que gitk pour parcourir l’historique afin de trouver le fichier dont la mémoire est à moitié mémorisée. (utilisez gitk --all si nécessaire pour toutes les twigs)

Une des choses les plus fastidieuses ici est d’obtenir le chemin du fichier supprimé. J’ai donc écrit une commande simple, où un utilisateur dev ou un utilisateur 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, faites-le.