如何在Git中检出某个文件的特定版本?


87

如何在git中检出某个文件的特定版本?

在邮件列表中找到了这封邮件,其中说:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

但是我不知道如何找出“ HEAD〜43”,如果执行a git log aFile,如何找出应该使用的“ HEAD〜43”?

为什么我需要git reset为该文件运行?它有什么作用?


“ git reset <提交> <文件>”与“ git checkout <提交> <文件>”完全相同。
JakubNarębski09年

2
如果您的问题是关于HEAD〜43语法(记录在git-rev-parse中),请询问此问题,而不是与您不知道答案的无关问题。“
HEAD〜45

根据lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/…lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git- reset.html,“ git reset <commit> <file>”与“ git checkout <commit> <file>”不完全相同:“ git reset <commit> <file>”还原索引中的<file>从<commit>中删除而不在工作树中触摸<file>,但是“ git checkout <commit> <file>”从<commit>更新<file>的索引,然后在工作树中更新<file>。
yoda 2010年

2
如果以下任何答案回答了您的问题,即Stack Overflow的工作方式,则可以通过单击旁边的对号来“接受”答案;细节在这里。但前提是您的问题得到回答;如果不是,请考虑为问题添加更多详细信息和/或对答案进行评论,以说明尚不清楚的内容(尚未)。
TJ Crowder

Answers:


104

您知道文件属于什么提交(即特定修订)吗?然后做:

git checkout <commit> <file>

另一个命令:

git checkout HEAD~N <file>

用于想要从某个范围返回文件的版本时(出于怀旧之情)。


19

HEAD~43只是树状结构,因此您可以使用哈希或标签。您必须使用分隔树名和文件名--,否则将其视为文件名。例如。

git checkout v0.45 -- filename
git checkout HEAD^ -- filename
git checkout 16bb1a4eeaa9 -- filename

2

HEAD~43指文件的提交(版本)。取而代之的是,您可以使用git log通过对文件执行操作获得的提交哈希。如果只需要该文件,则无需在该文件上运行git reset。仅在要将文件转发到当前HEAD时才需要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.