我在编辑器中打开了文件“main.cpp
”。
我也希望在编辑器中看到“main.cpp
”的上一版本。
我现在这样做的方式是这样的。
close "main.cpp" in the editor
prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>
open "main.cpp" and "old_main.cpp" in the editor
可以简化,所以我不必在编辑器中关闭“main.cpp”吗?
我希望的是git-checkout
的变种,可以做到这一点。
更新:我在mac osx 10.5.7上使用git
prompt> git --version
git version 1.6.0.4
prompt>
UPDATE2:JakubNarębski回答是:
prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>
更新3:Karmi的回答,针对特定修订:
prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt>
答案 0 :(得分:268)
您可以使用“git show”:
prompt> git show HEAD^:main.cpp > old_main.cpp
(请注意:
和HEAD^
之间存在冒号[main.cpp
]字符。)<revision>:<path>
手册页中描述了:
语法。 “指定修订”部分的最后一点:
- &lt; rev&gt;:&lt; path&gt;,例如HEAD:README,:README,master:./ README
后缀
:path
后跟一个路径,命名在冒号前的部分命名的树形对象中给定路径上的blob或树。./
(在冒号前面有一个空部分)是下面描述的语法的特例:在给定路径的索引中记录的内容。以
../
或<path>
开头的路径是相对于当前工作目录的。给定路径将转换为相对于工作树的根目录。这对于从与工作树具有相同树结构的提交或树中寻址blob或树非常有用。
请注意,.git/
这里是相对于项目的顶级目录的 FULL 路径,即带有./<path>
目录的目录。 (或者更准确地说是“&lt; revision&gt; ”(通常可以是任何&lt; tree-ish&gt; ,即代表树的东西))
如果要使用相对于当前目录的路径,则需要使用../path
语法(或git cat-file
从当前目录开始)。
编辑2015-01-15:添加了有关相对路径语法的信息
在大多数情况下,您可以使用低级(管道)prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
命令获得相同的输出:
{{1}}
答案 1 :(得分:21)
只是添加到Jakub的答案:如果您只想浏览终端中的文件内容,则甚至不必将输出重定向到>
的文件。您只需运行$ git show 58a3db6:path/to/your/file.txt
。
答案 2 :(得分:1)
为了获得一致的结帐行为,包括 autocrlf
等,请使用辅助文件夹(例如 TEMP)并从旧的/不同的文件状态恢复,如下所示:
git --work-tree TEMP/ restore -s <commit> main.cpp
mv TEMP/main.cpp old_main.cpp
注意:
git show <commit>:main.cpp > old_main.cpp
.. 只会从存储库中生成原始读取。
为了更舒适地使用替代文件状态(无需重命名),请使用辅助“匿名”目录作为(长期)并行工作树,如下所示:
# one time setup
mkdir WD2
cd WD2
echo gitdir: WD1 > .git
# operate freely here with an alternative file set while the same branch is checked out in git
git restore -s <commit> main.cpp
(WD2:次要目录的路径。WD1:主要目录的路径 - 绝对或相对)
注意:任何类型的 git 项目工作(恢复/添加/提交/切换...,构建任务)都可以使用该替代文件集完成 - 好像突然间 WD1 中的工作树文件会被交换。硬链接可用于在巨大的存储库中有效地镜像未更改的文件。
类似地,可以通过 git-worktree 使用“链接工作树”(自 git v2.6.7 起新增)。这会导致更多的 git 开销,但允许在不使用额外存储库的情况下同时在不同的分支(或分离的头)上签出和工作。