Comment puis-je extraire une version particulière d'un fichier dans Git?

87

Comment puis-je extraire une version particulière d'un fichier dans git?

J'ai trouvé ce mail sur la liste de diffusion , qui disait:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

Mais je ne comprends pas comment trouver 'HEAD ~ 43', si je fais un git log aFile, comment puis-je savoir quel 'HEAD ~ 43' je dois utiliser?

Et pourquoi dois-je exécuter git resetpour ce fichier? Qu'est ce que ça fait?

n179911
la source
"git reset <commit> <file>" fait exactement la même chose que "git checkout <commit> <file>".
Jakub Narębski
2
Si votre question concerne la syntaxe HEAD ~ 43 (documentée dans git-rev-parse), posez des questions sur ce problème, pas sur un problème sans rapport avec lequel vous connaissez la réponse. "Que signifie HEAD ~ 45 et comment trouver une version particulière du fichier"
Jakub Narębski
selon lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/… et lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- reset.html , "git reset <commit> <file>" ne fait pas exactement la même chose que "git checkout <commit> <file>": "git reset <commit> <file>" retourne <file> dans l'index depuis <commit> sans toucher <file> dans l'arborescence de travail, mais "git checkout <commit> <file>" met à jour l'index pour <file> à partir de <commit> puis met à jour <file> dans l'arborescence de travail.
yoda
2
Si l'une des réponses ci-dessous répond à votre question, sur le fonctionnement de Stack Overflow, vous «acceptez» la réponse en cliquant sur la coche à côté; détails ici . Mais seulement si votre question est répondue; sinon, envisagez d'ajouter plus de détails à la question et / ou des commentaires sur les réponses indiquant ce qui n'est pas (encore) clair.
TJ Crowder

Réponses:

104

Vous savez à quel commit (ie: la révision spécifique) le fichier appartient? Alors fais:

git checkout <commit> <file>

L'autre commande:

git checkout HEAD~N <file>

C'est pour quand vous voulez obtenir une version du fichier à partir d'une gamme de retour (ce que je fais par nostalgie).

Faux code singe Rashid
la source
19

HEAD~43est simplement arborescent, vous pouvez donc utiliser un hachage ou une balise. Vous devez séparer treeish du nom de fichier avec --, sinon il est traité comme nom de fichier. Par exemple.

git checkout v0.45 -- filename
git checkout HEAD^ -- filename
git checkout 16bb1a4eeaa9 -- filename
dhill
la source
2

HEAD~43fait référence au commit (version) du fichier. Au lieu de cela, vous pouvez utiliser le hachage de validation que vous obtenez en effectuant git logsur le fichier. Si vous voulez juste le fichier, vous n'avez pas besoin de l'exécuter git reset; cela n'est nécessaire que si vous souhaitez transférer le fichier vers le HEAD actuel.

Jim Puls
la source