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

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

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

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

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


当前回答

通过签出以前的提交并复制文件,从以前的提交中获取文件。

注意你在哪个分支上:git分支 签出你想要的上一个提交:git签出27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 将需要的文件复制到临时位置 签出你开始的分支:git Checkout thebranchyounotes 复制放入临时位置的文件 提交你的更改到git: git Commit -m "添加的文件??从之前的提交"

其他回答

git checkout {SHA1} -- filename

这个命令从特定的提交中获取复制的文件。

在Windows中,使用Git Bash:

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

除了其他答案列出的所有选项,你可以使用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:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java

引号是必需的,所以它保留了换行符。

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

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