2009-07-23 3 views
75

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

Je trouve this mail on the mailing list, qui a dit:

$ 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 que « HEAD ~ 43 Je devrais utiliser? Et pourquoi dois-je exécuter git reset pour ce fichier? Qu'est ce que ça fait?

+0

"git reset " fait exactement la même chose que "git checkout ". –

+2

Si votre question concerne la syntaxe HEAD ~ 43 (documentée dans git-rev-parse), renseignez-vous sur ce problème, et non sur celui dont vous connaissez la réponse. Qu'est-ce que HEAD ~ 45, et comment trouver la version particulière du fichier " –

+0

selon http://www.lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- checkout.html et http://www.lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-reset.html, "git reset " ne fait pas exactement le même que « git checkout »: « git reset » Ramène dans l'index de sans toucher dans l'arbre de travail, mais « git checkout » met à jour l'index pour de puis la mise à jour dans le travail arbre. – yoda

Répondre

94

Vous savez à quel commit (ie: la révision spécifique) appartient le fichier? Ensuite, faites:

git checkout <commit> <file> 

L'autre commande:

git checkout HEAD~N <file> 

est quand vous voulez obtenir une version du fichier à partir d'une plage arrière (ce que je fais pour la nostalgie).

+0

Ceci devrait être la réponse acceptée. – TinkerTenorSoftwareGuy

2

HEAD~43 fait référence à la validation (version) du fichier. Au lieu de cela, vous pouvez utiliser le hash de commit que vous obtenez en faisant git log sur le fichier. Si vous voulez juste le fichier, vous n'avez pas besoin d'exécuter git reset dessus; C'est seulement nécessaire si vous voulez transférer le fichier vers le HEAD actuel.

15

HEAD~43 est juste arboricole, de sorte que vous pouvez utiliser un hachage ou une étiquette. 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 
Questions connexes