如何从git存储库获取文件的特定(较旧)版本而不擦除较新版本?

问题描述:

我应该认为获取以前的版本是源代码控制的首要功能之一,应该很简单,但它看起来像寻找git解决方案的寻宝游戏。如何从git存储库获取文件的特定(较旧)版本而不擦除较新版本?

我遇到了*问题How can I check out a particular version of one file in Git?。套用事情的关键:

git checkout <commit hash from git log output> 

正如我预期的事情发生,在工作目录中的文件被替换/更新与请求的旧版本,但我失去了以后的版本在仓库中,有一个像消息“......分开的头......”。

这里的任何指导原则将不胜感激。谢谢。

+0

据我了解,你没有失去以后的版本库 - 检查出这个问题的答案 - https://*.com/questions/10228760/fix-a-git-detached-head –

当你只是用git checkout <somehash>,那么你将进入一个分离的头。发生这种情况是因为默认情况下git checkout只是切换分支,并且指定提交而不是分支会使您进入“无分支模式”(这是分离的HEAD手段)。

如果您想从不同版本获取单个文件,还需要指定路径,即git checkout <somehash> -- path/to/file。这将使所有内容保持原样,只需以path/to/file替换文件<somehash>即可。

所以这会覆盖文件。如果您还想保留当前版本,则应该先将其重命名。否则,你也可以使用的git show一个特殊的语法这

git show <somehash>:path/to/file > new_filename.ext 

这将主要来自<somehash>获得文件的内容并打印出来,所以如果你管到文件,您可以提取一个文件不同的版本到不同的文件名。

+0

谢谢。 show命令的特殊语法解决了我的问题。我不想更改存储库的状态,我只是想看看旧版本的代码。 – nothingseasy

如果你有一个特殊的承诺像abc123456并在提交该文件是好的,你只需要...

git checkout abc123456 path/to/file 

用这个命令,你会在阶段发现版本的文件。

您还可以使用分支:

git checkout old-branch-name path/to/file