git-checkout使用新名称对文件进行较旧的修订


264

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 OS X 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>

UPDATE3:Karmi的答案,针对特定版本:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

您使用什么编辑器?也许它的插件/插件/模块添加了对Git的支持?
2009年

我使用textmate。它有一些git支持,我没有检查它是否可以做到。
neoneye

Textmate具有git捆绑包:github.com/timcharper/git-tmbundle(您应该检查git wiki上的InterfacesFrontendsAndTools页面:git.or.cz/gitwiki
JakubNarębski09年

顺便说一句,Emacs中的VC接口(Git也以vc-git.el的形式提供了支持)具有“显示其他版本”命令。如果TexMate Git捆绑包(git-tmbundle)没有它,也许值得添加。
2009年

我使用符号链接可以更好地跟踪TextMate中的项目。25个dirs,300个文件。这有助于隐藏builddir和其他不相关的目录。但是git / TextMate对这些符号链接不是很满意,所以没有:-(
neoneye

Answers:


312

您可以为此使用“ git show”:

prompt> git show HEAD^:main.cpp > old_main.cpp

(请注意,和:之间有冒号[ ]字符。)语法在git rev-parse联机帮助页中进行说明,该手册页位于“指定修订版本”部分的最后一点旁边:HEAD^main.cpp<revision>:<path>

  • <rev>:<path>,例如HEAD:README,:README,master:./ README

    在后缀:后跟路径的名称是树状对象中给定路径上的斑点或树的名称,该对象由冒号前的部分命名。:path(冒号前有一个空白部分)是下面描述的语法的一种特殊情况:在给定路径的索引中记录的内容。

    以当前工作目录开头./../相对于当前工作目录的路径。给定的路径将被转换为相对于工作树的根目录。这对于处理具有与工作树相同的树结构的提交或树中的Blob或树非常有用。

请注意,<path>这里是相对于项目顶层目录完整路径,即带有目录的目录。(或更确切地说,是“ <revision> ”(通常可以是任何<tree-ish>,即表示树的东西)).git/

如果要使用相对于当前目录的路径,则需要使用./<path>语法(或../path从当前目录上移)。

编辑2015-01-15:添加了有关相对路径语法的信息


在大多数情况下,您可以使用低级(管道)git cat-file命令获得相同的输出:

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
我对完整副本感兴趣,但是git-show仅显示差异。.我尝试使用--pretty选项。解决不了。
neoneye

7
“ git show HEAD ^ main.cpp”(在HEAD ^和main.cpp之间有空格)与“ git show HEAD ^:main.cpp”(在HEAD ^和main.cpp之间有冒号 “:”)不同。
JakubNarębski09年

嗯,冒号我看到了这个错误,所以我认为冒号是一个错误。是的,似乎冒号是要走的路,但是我该如何解决呢?提示> git show HEAD ^:main.cpp致命:模棱两可的参数'HEAD ^:main.cpp':未知版本或不在工作树中的路径。使用'-'将路径与修订提示分开>
neoneye

2
这可能意味着您输入了错误的PATHNAME(不幸的是,由于“ git show”魔术git无法给出更好的错误消息)。它应该是相对于您项目的顶级目录的完整路径名:$(git ls-tree -r --name-only HEAD ^ | grep main.cpp)
JakubNarębski09年

3
从文档开始,而不是完整路径:“以./或../开头的路径是相对于当前工作目录的。” 适用于我的1.8.5版本。
LVB

24

只是为了补充Jakub的答案:>如果您只想在终端中浏览文件内容,甚至不必使用将输出重定向到文件。你可以跑步$ git show 58a3db6:path/to/your/file.txt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.