我有一个Git存储库,我想看看几个月前一些文件的样子。我找到了那个日期的修订本;这是27 cf8e84bb88e24ae4b4b3df2b77aab91a3735d8。我需要看到一个文件看起来像什么,并将其保存为(“新”)文件。

我设法使用gitk查看文件,但它没有保存它的选项。我尝试使用命令行工具,我得到的最接近的是:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

但是,该命令显示的是一个差异,而不是文件内容。我知道我可以稍后使用类似PAGER=cat的东西并将输出重定向到一个文件,但我不知道如何获得实际的文件内容。

基本上,我在找svn cat之类的东西。


当前回答

除了其他答案列出的所有选项,你可以使用git重置感兴趣的git对象(散列,分支,HEAD~x,标签,…)和你的文件路径:

git reset <hash> /path/to/file

在你的例子中:

git reset 27cf8e8 my_file.txt

这样做的目的是将my_file.txt还原为索引中提交27cf8e8处的版本,同时在工作目录中保持它的原形(即当前版本)。

从这里开始,事情变得非常简单:

you can compare the two versions of your file with git diff --cached my_file.txt you can get rid of the old version of the file with git restore --staged file.txt (or, prior to Git v2.23, git reset file.txt) if you decide that you don't like it you can restore the old version with git commit -m "Restore version of file.txt from 27cf8e8" and git restore file.txt (or, prior to Git v2.23, git checkout -- file.txt) you can add updates from the old to the new version only for some hunks by running git add -p file.txt (then git commit and git restore file.txt).

最后,你甚至可以交互式地选择哪块(s)重置在第一步,如果你运行:

git reset -p 27cf8e8 my_file.txt

所以git重置路径为你提供了很大的灵活性,可以检索文件的特定版本,与当前签出的版本进行比较,如果你选择这样做,还可以完全还原到该版本,或者只还原到该版本的一些块。


编辑:我刚刚意识到我没有回答你的问题,因为你想要的不是一个不同的或一个简单的方法来检索部分或全部旧版本,而只是cat那个版本。

当然,你仍然可以在重置文件后这样做:

git show :file.txt

输出到标准输出或

git show :file.txt > file_at_27cf8e8.txt

但如果这就是你想要的,直接运行git show 27cf8e8:file.txt,就像其他人建议的那样,当然要直接得多。

我将留下这个答案,因为直接运行git show可以让你立即获得旧版本,但如果你想用它做一些事情,从那里做这件事远不如在索引中重置那个版本那么方便。

其他回答

在Windows中,使用Git Bash:

在工作空间中,将dir更改为文件所在的文件夹 Git显示cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file。Ext > old.ext

你需要提供文件的完整路径:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt

这将帮助您在提交之间获得所有已删除的文件,而无需指定路径,如果有大量文件被删除,则非常有用。

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1

除了其他答案列出的所有选项,你可以使用git重置感兴趣的git对象(散列,分支,HEAD~x,标签,…)和你的文件路径:

git reset <hash> /path/to/file

在你的例子中:

git reset 27cf8e8 my_file.txt

这样做的目的是将my_file.txt还原为索引中提交27cf8e8处的版本,同时在工作目录中保持它的原形(即当前版本)。

从这里开始,事情变得非常简单:

you can compare the two versions of your file with git diff --cached my_file.txt you can get rid of the old version of the file with git restore --staged file.txt (or, prior to Git v2.23, git reset file.txt) if you decide that you don't like it you can restore the old version with git commit -m "Restore version of file.txt from 27cf8e8" and git restore file.txt (or, prior to Git v2.23, git checkout -- file.txt) you can add updates from the old to the new version only for some hunks by running git add -p file.txt (then git commit and git restore file.txt).

最后,你甚至可以交互式地选择哪块(s)重置在第一步,如果你运行:

git reset -p 27cf8e8 my_file.txt

所以git重置路径为你提供了很大的灵活性,可以检索文件的特定版本,与当前签出的版本进行比较,如果你选择这样做,还可以完全还原到该版本,或者只还原到该版本的一些块。


编辑:我刚刚意识到我没有回答你的问题,因为你想要的不是一个不同的或一个简单的方法来检索部分或全部旧版本,而只是cat那个版本。

当然,你仍然可以在重置文件后这样做:

git show :file.txt

输出到标准输出或

git show :file.txt > file_at_27cf8e8.txt

但如果这就是你想要的,直接运行git show 27cf8e8:file.txt,就像其他人建议的那样,当然要直接得多。

我将留下这个答案,因为直接运行git show可以让你立即获得旧版本,但如果你想用它做一些事情,从那里做这件事远不如在索引中重置那个版本那么方便。

最简单的方法是这样写:

git show HASH:file/path/name.ext > some_new_name.ext

地点:

HASH是Git修订的SHA-1哈希值 文件/道路/的名字。Ext是您要查找的文件的名称 some_new_name。Ext是保存旧文件的路径和名称

例子

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

这将把修订版27cf8e中的my_file.txt保存为一个名为my_file.txt. old的新文件

它是用Git 2.4.5测试的。

如果你想检索被删除的文件,你可以使用HASH~1(在指定HASH之前提交一次)。

例子:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt