如何在不影响存储库状态的情况下将工作目录恢复到给定的提交?

时间:2016-01-09 22:10:26

标签: git

我想将我的工作目录的整个内容恢复到某个提交中保存的内容,但是没有对存储库状态进行任何更改 - 所以,请不要detached head state,因为它让我自己的头忙于无关的东西,当我想要的只是基本的restore this folder contents from that backup

我是git的新手,我尽力不让这个帖子成为一个git rant,但是为了上帝的缘故,为什么git checkout命令没有--wdironly开关(或类似的东西)?

为什么HEAD重新分配是强制性的?

缺乏简单的“git restore”等同于如此不方便,违反直觉和令人沮丧,我发现自己在问:“为什么我甚至使用它?它在使用上有这样的开销,我甚至无法利用它来做最简单的事情我希望的任务。“

无论如何,这是交易:

假设master分支中有2个提交。

可能还有其他一些分支,但我们将专注于这一个。提交是:“第一”和“第二”,显然是“第二”是最新的。

我的工作目录中还有一些我不关心的垃圾,因此在“恢复备份”之前可以安全地删除其内容。

但是,我的索引中可能会有一些宝贵的数据,所以请尽可能不要碰它。

现在:

我想获取“First”提交包含的所有文件,并将它们复制到我的工作目录 而已。

我如何实现这种“不寻常的愿望”?

2 个答案:

答案 0 :(得分:2)

好的,既然我自己找到了答案,我意识到这是一个很糟糕的问题。

无论如何,为了您的方便 - 现在和未来的新手 - 这里是我正在寻找的git命令:

git checkout <given commit SHA> *

请注意命令末尾的星号。由于git checkout <commit> <filename>恢复了所选文件,因此星号只是&#34;所有文件的通配符&#34;。

答案 1 :(得分:0)

  

我想把所有文件都带到第一个&#34; commit包含并将它们复制到我的工作目录。

您可以使用git cherry-pick <sha1>将所需的提交添加到当前分支

enter image description here

  

我想将工作目录的全部内容恢复到某些提交中保存的内容,但不对存储库状态进行任何更改

# checkout new branch from a given commit
# and switch to this branch 
git checkout -b new_branch 7cd6289
  

我的工作目录中还有一些我不关心的垃圾,因此可以安全删除其内容,然后再恢复备份&#34;。

# clean all your uncommitted files
git clean -Xfd
git clean -xfd
  

-x(小写)

     

不要使用从.gitignore(每个目录)和$ GIT_DIR / info / exclude读取的标准忽略规则,但仍然使用-e选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。

     

可以使用它(可能与git reset一起使用)来创建一个pristine工作目录来测试干净的构建。

     

-X(大写)

     

仅删除Git忽略的文件。   这可能有助于从头开始重建所有内容,但保留手动创建的文件。