如何从git存储库的历史记录中恢复整个目录?


91

我想从我的git存储库的历史记录中(递归)还原整个目录。

只有1个分支(主)。

我知道包含错误的提交。

我是否可以使用父提交的sha1哈希值还原包含错误之前的目录状态?

我想到了这样的事情:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

但它没有用。


7
尝试在修订和路径之间添加“-”:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
CarlosCampderrós2012年

这有所帮助。非常感谢你。
最受欢迎的2012年

1
@CarlosCampderrós写出这是一个真实的答案,并在其他人之前收集您的15分;)
ralphtheninja 2012年

@MagnusSkog我不确定是否可以,所以我发表评论只是为了检查。现在,我确定它可以正常工作,我已将其记录为答案:)
CarlosCampderrós2012年

2
作为一般提示,“它不起作用”不是很有用。告诉我们为什么它不起作用,理想情况下是带有错误输出(如果很长,则将其修剪掉)。
2012年

Answers:


156

尝试在修订和路径之间添加“-”:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

如果要从上一次提交恢复目录,则可以用HEAD〜1替换提交哈希,例如:

git checkout HEAD~1 -- path/to/the/folder/ 

相同的命令,几乎不同的目的:stackoverflow.com/questions/953481/...
cregox

18
但是有一个问题:OP没有指定目录是否仍然存在。要将现有目录恢复到提交状态,应首先删除目录的内容。在其他情况下,旧提交中不存在的现有文件将不会被删除。
Alberto 2014年

7
+1 @Alberto完全同意。我做了rm -Rf path/to/the/folder,然后git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/-结果:该路径有完全相同的文件,在该承诺,不,这已经在这之后创建的差异并没有多余的文件提交。这就是我想要的。
therobyouknow,2015年

2
怎么--办?
雷·福斯

2
@RayFoss告诉git以下参数是文件(否则它们可能与提交哈希,分支或其他东西混淆)。通常不需要它们,但放它们也不会受到伤害
CarlosCampderrós18

3

有两种简单的方法可以做到这一点:

如果包含错误的提交包含错误,请用于git revert反转其影响。

如果没有,简单的方法是这样的:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

如果您只是这样做,git checkout <SHA-ID>那么它将暂时将您转移到该sha-commit。

每个提交对象当时都拥有磁盘的整个结构,因此,如果那里有文件并且需要将它们复制出来,则可以这样做。但是请注意,您将不在任何分支中,因此在将文件复制到工作树并提交之前,您必须先移回master。


重新“移回主人”是指结帐主人吗?
Pacerier
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.