如何在git存储库中获取文件旧版本的副本?

如何在git存储库中获取文件旧版本的副本?,git,git-checkout,Git,Git Checkout,我有一个版本的.tex文件,它是我之前多次提交的,我想得到一份副本。我有提交的sha1散列值,它具有我想要的文件版本。我不想替换文件的当前版本。相反,我只想得到一个单独的副本,它反映了旧版本的状态 许多类似的问题建议使用git checkout--file.tex,但这只是不断给出“错误:pathspec'file.tex'与git已知的任何文件都不匹配。” 我感兴趣的文件最初存在于存储库的顶级目录中。我目前在存储库的子目录中,试图运行此命令,以便在子目录中获取较旧版本的file.tex 这可能

我有一个版本的
.tex
文件,它是我之前多次提交的,我想得到一份副本。我有提交的sha1散列值,它具有我想要的文件版本。我不想替换文件的当前版本。相反,我只想得到一个单独的副本,它反映了旧版本的状态

许多类似的问题建议使用
git checkout--file.tex
,但这只是不断给出“错误:pathspec'file.tex'与git已知的任何文件都不匹配。”

我感兴趣的文件最初存在于存储库的顶级目录中。我目前在存储库的子目录中,试图运行此命令,以便在子目录中获取较旧版本的file.tex


这可能吗?我怎样才能做到这一点?

我认为最好的解决方案是临时覆盖您的文件。在存储库的顶层:

git checkout <sha1> file.tex
cp file.tex directory
git checkout HEAD file.tex
git checkout file.tex
cp file.tex目录
git checkout HEAD file.tex

您可以使用
git cat file
将文件内容转储到标准输出,并将其重定向到所需的目标:

git cat-file -p <sha1>:./file.tex > wherever.tex
git cat file-p:./file.tex>where.tex

如果您位于存储库的子目录中,
/
是必需的,如果您位于存储库的顶层,则可能会忽略它。此外,这在较旧版本的git中可能不起作用,在这种情况下,您需要显式提供文件相对于存储库根的完整路径。

使用带有绝对存储库路径的
git show

workdir$git显示修订版:repo/module/package/code.file>code.file.old

或相对于当前目录的路径:

包$git显示修订版:./code.file>workdir/code.file.old

与签出文件不同,
show
不会从本质上改变您的工作空间,您可以对输出执行任何您喜欢的操作


这要归功于,当然可以在中查看完整的详细信息。

复制当前文件,然后运行
git checkout file.ext
?这是迄今为止我见过的最好的解决方案。我仍然感到恼火的是,似乎没有办法直接获取该文件。最后一个命令必须是
git checkout HEAD file.tex
。第一个checkout命令将修改索引和工作树副本,因此不指定修订的checkout仍将使用旧版本。请注意,与许多其他git命令不同,文件名(此处为“file.tex”)必须是git repo根目录中的名称;因此,如果您想要foo/file.tex,并且您在子目录foo中,您不能键入上述内容,您必须键入:foo/file.tex,尽管您已经在foo中。@Daniel,这是真的。但是,至少在git的最新版本中,您可以始终使用
来引用当前目录。我更新了我的答案来反映这一点。现在我相信轮回。太好了。git cat file-p^:./file.tex>where.tex从上一次提交中获取文件版本吗?@ATL_DEV,执行此操作的任何命令语法都需要指定(1)要使用的命令,(2)要获取的路径/文件,(3)提交的标签或sha,(4)文件副本的目标。如何简化语法?这显然是最准确的答案,因为它不会更改存储库的版本/状态,并允许恢复任何回购状态。