Affichage d'un fichier supprimé dans Git

105

J'ai supprimé un fichier avec Git puis validé, donc le fichier n'est plus dans ma copie de travail. Je veux regarder le contenu de ce fichier, mais pas vraiment le restaurer. Comment puis-je faire ceci?

Colin Ramsay
la source

Réponses:

145
git show HEAD^:path/to/file

Vous pouvez utiliser un identifiant de validation explicite ou HEAD~npour voir des versions plus anciennes ou s'il y a eu plus d'un commit depuis que vous l'avez supprimé.

CB Bailey
la source
6
Notez qu'il path/to/files'agit du chemin complet depuis le haut du projet (répertoire supérieur du référentiel).
Jakub Narębski
1
J'ai fatal: Invalid object name 'HEAD^'.(je dois mentionner que je n'ai que "Initial commit")
vladkras
1
Si la suppression est par étapes mais non validée, utilisez HEAD au lieu de HEAD ^ (car elle existait dans HEAD). Par exemple, je pensais avoir besoin d'un fichier, alors je l'ai ajouté et je me suis engagé à enregistrer mon travail, puis je l'ai supprimé plus tard lorsque j'ai proposé une solution différente. Pour voir le fichier d'origine avant de recommencer, j'ai fait git show HEAD: path / to / file
Tony Wickham
1
Je pense qu'il vaut également la peine de mentionner que cela ne fonctionne que si le fichier a été supprimé dans le commit le plus récent. Si le fichier a été supprimé il y a plusieurs validations, vous devrez utiliser l'une des autres réponses.
jayhendren le
50

S'il s'agit d'un fichier que vous avez supprimé il y a quelque temps et que vous ne souhaitez pas rechercher une révision , vous pouvez utiliser (le fichier est nommé foodans cet exemple; vous pouvez utiliser un chemin complet):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

L' rev-listappel recherche toutes les révisions de foomais n'en répertorie qu'une. Étant donné que les rev-listlistes sont dans l'ordre chronologique inverse, ce qu'elle répertorie est la dernière révision qui a changé foo, qui serait le commit qui a été supprimé foo. (Ceci est basé sur l'hypothèse que git ne permet pas à un fichier supprimé d'être modifié et de rester supprimé.) Vous ne pouvez pas simplement utiliser la révision qui rev-listretourne telle quelle car elle foon'existe plus là-bas. Vous devez demander celui juste avant qui contient la dernière révision du fichier, d'où le ^in git show.

Louis
la source
2
Vous devrez peut-être changer le dernier foo en ./foo. Et pour ceux qui n'utilisent pas bash, obtenez l'id avec "git rev-list --max-count = 1 --all - foo" puis faites "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" avec l'id (524 .. est l'id)
Dror
1
Bonne réponse. J'ai dû utiliser ~ au lieu de ^. Pas certain de pourquoi. Et juste pour que les gens soient clairs, 'foo' ici doit être un chemin complet depuis la racine git.
pedorro
Vous pouvez écrire **/foosi vous ne connaissez pas le chemin (cela fonctionnera pour la commande rev-list mais pas pour la commande show. Cependant, avec le commit de la commande rev-list, vous pouvez alors trouver le chemin).
Nickolai
10

Puisque vous ne vous souvenez peut-être pas du chemin exact, vous pouvez à la place obtenir le sha1 à partir du journal git, puis vous pouvez simplement émettre

 git cat-file -p <sha1>
pdeschen
la source
5
Au nom de Samuel Slund : Une façon de trouver la somme sha1 à utiliser ci-dessus est: git whatchanged --no-abbrevcela donne une sortie similaire à git (ou svn) log.
bruit