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
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.
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.
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.