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

97

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

我找到了这个邮件列表上的帖子,其中写道:

$ git checkout HEAD~43 Makefile
$ git reset Makefile

但是我不明白如何找出'HEAD~43',如果对一个文件运行git log aFile ,如何确定应该使用哪个'HEAD~43'?

还有为什么需要运行git reset来处理这个文件?它是做什么的?


1
"git reset <commit> <file>" 的作用与 "git checkout <commit> <file>" 完全相同。 - Jakub Narębski
2
如果您的问题涉及 HEAD43 语法(在 git-rev-parse 中有记录),请就此问题提问,而不是关于您已知答案的无关问题。 “HEAD45 是什么意思,如何找到特定版本的文件” - Jakub Narębski
根据http://www.lt.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-checkout.html和http://www.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>"会更新<file>的索引为<commit>,然后更新工作树中的<file>。 - yoda
正如T.J.所建议的那样,请将下面的答案标记为已接受。 - Jonathan H
1
可能是使用Git重置或还原特定文件到特定版本?的重复问题。 - 1615903
3个回答

117

你知道文件属于哪个提交(即特定的版本)吗?那么可以执行以下操作:

git checkout <commit> <file>

另一个命令:

git checkout HEAD~N <file>

这是用于从历史版本中获取文件的情况(我通常出于怀旧目的使用此功能)。


20

HEAD~43 只是树形结构的一种表示方式,所以你可以使用哈希值或标签名。你必须用--将树形结构和文件名分开,否则它会被视为文件名。例如:

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

2

HEAD~43 指的是文件的提交(版本)。相反,您可以使用从 git log 命令中获取的提交哈希值。如果您只需要该文件,那么您不需要在其上运行 git reset 命令;只有当您想将该文件前向移植到当前 HEAD 时才需要运行该命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接