恢复Git存储库中已删除的文件夹


97

我已删除文件夹中的所有内容,并且该文件夹为空。我的远程仓库中仍然有一个副本。但是当我这样做时,git pull它没有放回已删除的文件,是不是应该这样做?

所以我做了一些研究,发现您可以通过执行以下操作来还原文件 git checkout <revision> -- <name of file>

但这仅适用于文件。

如何检索目录中的所有文件?


1
git status会提示您要执行的命令
Tavian Barnes

1
听起来您的远程仓库中仍然有旧目录(甚至在本地仓库中也有)。强烈建议:1)从您的远程存储库中“拉”到一个新的存储库中(不要对您的本地存储库造成更多损害)。2)在新的本地仓库中尝试“签出” ...甚至“还原”:atlassian.com/git/tutorials/undoing-changes/git-revert。3)当您确定一切正常时,更新远程仓库。
paulsm4 2015年

Answers:


244

您可以使用文件进行的所有操作,也可以使用文件夹进行的操作。

还要注意在Git存储库中查找并恢复已删除的文件


文件从工作树中删除,但尚未提交:

如果尚未建立索引(git add),则可以还原目录的内容:

git checkout -- path/to/folder

如果已为删除建立索引,则应首先将其重置:

git reset -- path/to/folder
git checkout -- path/to/folder


恢复完整的工作树(而不是单个文件夹),但是丢失所有未提交的更改

git reset --hard HEAD


过去在某些提交中删除文件时:

查找影响给定路径的最后一次提交。由于该文件不在HEAD提交中,因此此提交必须已将其删除。

git rev-list -n 1 HEAD -- <file_path>

然后,使用caret(^)符号在提交之前检出版本:

git checkout <deleting_commit>^ -- <file_path>


从远程提交恢复整个工作树

git reset --hard <revision> 

1
git checkout -- path/to/folder/* 不起作用 注意:问题是如何还原文件夹而不是文件
gman

@gman How can I retrieve all the files inside the directory表示目录及其文件。但是令人惊讶的是,该命令对我也不起作用。我记得一年前所做的。
尼克·沃伦金

2
@gman但它的工作方式类似于git checkout -- pathgit checkout -- 'path/*'。在您的示例中,您删除git rm了OP似乎没有执行的操作。我已经为这种情况添加了说明。谢谢!
尼克·沃林金

3
在Windows上,您需要这样引用:git checkout "<deleting_commit>^" -- <file_path>
Maor

即使我在reset命令上指定了一个文件夹,它也会在整个存储库中撤消一堆东西。这有什么意义?当我运行结帐时,它看起来像还原了我的文件夹。我不知道其余代码对我的其余代码造成了什么影响,是啊,对等存储库管理器用于集中存储库的乐趣,令人感叹。
Paul Kenjora

5

如果尚未提交更改,则可以还原内容或目录:

git checkout -- removed_directory

如果要还原所有更改,请执行以下操作:

git reset --hard HEAD

3
git checkout -- removed_directory 不起作用
gman

git checkout -- removed_directory为我工作,但我之前已经创建了该目录(通过该目录中的checkout一个文件)。创建后,所有文件都通过此命令还原到文件夹中。
Boolean_Type

3

对我来说唯一有效的方法是在另一个文件夹中签出仓库。假设当前仓库位于中/home/me/current

然后我做了

git clone /home/me/current /home/me/temp

这会在仓库中单独创建一个仓库 /home/me/temp

我现在可以/home/me/temp去做我想做的事。例如

git reset --hard commit-hash-before-delete

现在我可以将删除的文件夹复制回去

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

并删除临时文件夹

rm -rf /home/me/temp

的例子

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

不工作

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

其他例子如

git reset --hard HEAD

除了删除的文件以外,还具有破坏性。任何其他更改也将丢失。

相似地

git reset --hard some-commit

之后将丢失任何提交 some-commit


2

从git 2.24.0开始,有一个实验性的新git命令:git restore

git restore --staged some/deleted/folder

它向我显示git:'restore'不是git命令
Ahmed C

2

您可以使用git restore恢复文件或文件夹。

git restore --source master~1 "PATH_IN_YOUR_REPO"

在这里,高手〜1将恢复您的文件夹,从你的主分支“1”修改回来。

资料来源:https : //git-scm.com/docs/git-restore


0

如果不指定特定文件,则应该能够提取特定提交的全部内容。像:(git checkout 264794319e9695ba843cd6假设哈希值使您的所有文件处于正确状态)。

之所以pull没有还原文件,是因为git会将删除视为最新的更改,并将其应用到要删除的内容上。

(我建议在新的分支中进行试验。)


-1

对于未提交的删除,它就像这样简单:

git reset HEAD rel /路径/到/已删除/目录/ *

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.