git-checkout新名称下的旧文件修订版

时间:2009-05-20 14:52:08

标签: git

我在编辑器中打开了文件“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> 

3 个答案:

答案 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 开销,但允许在不使用额外存储库的情况下同时在不同的分支(或分离的头)上签出和工作。