在Git仓库中恢复已删除的文件夹

152

我已经删除了文件夹内的所有内容,该文件夹现在为空。我在远程仓库中还有一个备份。但是,当我执行git pull时,它并没有恢复被删除的文件,难道不应该这样吗?

因此,我进行了一些研究,发现可以通过执行git checkout <revision> -- <name of file>来恢复单个文件。

但是这仅适用于单个文件。

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


2
git status 会给你提示要运行哪些命令。 - Tavian Barnes
1
听起来你的远程仓库里还有旧目录(甚至可能在本地仓库中也有)。强烈建议:1)从远程仓库拉取到一个的仓库中(不要对本地仓库造成更多损害)。2)在你的新的本地仓库中尝试“checkout”...或者甚至是“revert”:https://www.atlassian.com/git/tutorials/undoing-changes/git-revert。3)当你确定一切都没问题时,更新远程仓库。 - paulsm4
随着 git-2.27.x 及以上版本的发布,请查看此处 - Rishabh B
11个回答

351

所有你可以对文件做的事情,你也可以用文件夹来做。

另外请注意在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>

然后使用插入符号(^)检出之前提交的版本:

git checkout <deleting_commit>^ -- <file_path>

从远程提交中还原完整的工作树

git reset --hard <revision> 

1
git checkout -- path/to/folder/*【无效】(http://pastebin.com/n2APK8ee)注意:问题是如何恢复文件夹而不是文件。 - gman
@gman “如何检索目录中的所有文件”意味着目录及其文件。但是这个命令对我也不起作用,这让我感到惊讶。我记得一年前它还可以正常工作。 - Nick Volynkin
2
@gman 但它的工作方式类似于 git checkout -- pathgit checkout -- 'path/*'。在您的示例中,您使用 git rm 进行删除,而 OP 似乎没有这样做。我已经为这种情况添加了说明。谢谢! - Nick Volynkin
3
在Windows中,您需要像这样加引号:git checkout "<deleting_commit>^" -- <file_path> - Maor
即使我在重置命令中指定了一个文件夹,它还是在整个repo中取消了一堆东西。这有什么意义呢?当我运行检出时,看起来它恢复了我的文件夹。我不知道unstage对我的其余代码做了什么,啊,点对点存储库管理器被用于集中式存储库的乐趣,叹息。 - Paul Kenjora

17

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

git restore --source master~1 "PATH_IN_YOUR_REPO"

这里,大师~1将您的文件夹恢复到您的主分支后退了“1”个版本。

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


你也可以使用HEAD。例如:git restore --source=HEAD~2 "Path_To_Restore"。顺便说一下,它可以是相对路径。 - v-andrew
错误信息:git:'restore' 不是 git 命令。 - John
@John 更新你的 Git。 - matt

12

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

git checkout -- removed_directory

如果你想要撤销所有更改,请执行以下操作:

git reset --hard HEAD

4
git checkout -- removed_directory 无效。 (翻译:The command git checkout -- removed_directory is ineffective, as per the provided link http://pastebin.com/0UKh07Fe.) - gman
git checkout -- removed_directory 对我很有效,但在此之前我已经创建了这个目录(通过 checkout 在该目录中的某个文件)。创建后,所有文件都通过此命令恢复到文件夹中。 - Boolean_Type

8

我因为一些无关的问题暂时删除了一个文件夹。我没有尝试从备份中恢复它,而是仅运行git restore folder/命令,将其恢复到分支最初的状态。


1
太棒了,正好满足了我的需求。 - Can Rau
git:'restore' 不是 git 命令。请参阅 'git --help'。最相似的命令是 remote - Owl
1
@Owl 更新你的 Git。 - matt
这是更新和最佳的做法。 - cryptolake

8
自 git 2.24.0 版本开始,有一个实验性的新 git 命令:git restore
git restore --staged some/deleted/folder

7
唯一有效的方法是在另一个文件夹中检出代码库。假设当前的代码库位于/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

以下是关于IT技术的示例:

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 之后将会丢失任何提交记录。


1
如果您只是想恢复已删除的文件夹,并且在删除后有其他提交记录,那么您也可以直接转到github.com上的项目页面。
在github.com上,转到您最后一次包含该文件夹的提交记录。您应该能看到提交信息,右侧有一个标有“浏览文件”的按钮。点击它将带您到该提交阶段的所有文件。
从那里,您可以克隆代码或仅下载代码作为zip文件。

0
如果您没有指定特定的文件,您应该能够提取特定提交的全部内容。例如:git checkout 264794319e9695ba843cd6(假设哈希值具有正确状态下的所有文件)。 pull不恢复文件的原因是git将您的删除视为更近期的更改,并将其应用于您正在拉取的任何内容之上。
(我建议在新分支中进行实验。)

0

如果您需要在没有Git命令的情况下进行恢复,请按照以下步骤操作

如果您有Github桌面版,这将使事情变得容易

如果没有,则安装并登录

  1. 转到文件

  2. 克隆存储库

  3. 选择存储库

  4. 单击历史记录

enter image description here

  1. 右键单击用于删除文件夹/文件的提交

enter image description here

  1. 选择还原提交中的更改选项

  2. 现在只需点击推送到源

enter image description here

全部完成!您已经恢复了删除的文件/文件夹,您可以在您的代码库中检查它。

-1

对于未提交的删除操作,只需要执行以下简单命令:

git reset HEAD rel/path/to/deleted/directory/*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接