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

jso*_*021 76 git git-checkout

我删除了文件夹中的所有内容,文件夹为空.我的远程仓库里还有一份副本.但是,当我做了一个git pull它没有放回已删除的文件是不是应该这样做?

所以我做了一些研究,发现你可以通过这样做来恢复文件 git checkout <revision> -- <name of file>

但这只适用于文件.

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

Nic*_*kin 197

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

另请注意在Git存储库中查找和还原已删除的文件

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

如果尚未编入索引(git add)您的更改,则可以还原目录的内容:

git checkout -- path/to/folder
Run Code Online (Sandbox Code Playgroud)

如果删除已经编入索引,则应首先重置:

git reset -- path/to/folder
git checkout -- path/to/folder
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

git rev-list -n 1 HEAD -- <file_path>
Run Code Online (Sandbox Code Playgroud)

然后使用caret(^)符号检查之前提交的版本:

git checkout <deleting_commit>^ -- <file_path>
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard <revision> 
Run Code Online (Sandbox Code Playgroud)

  • @gman但它的工作方式类似于`git checkout - path`或`git checkout - 'path/*'`.在您的示例中,您使用OP似乎没有执行的`git rm`删除.我已经为这种情况添加了说明.谢谢! (2认同)
  • 在Windows上,您需要像这样加上引号:`git checkout“ &lt;deleting_commit&gt; ^”-&lt;file_path&gt;` (2认同)

jBe*_*ger 8

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

git restore --source master~1 "PATH_IN_YOUR_REPO"
Run Code Online (Sandbox Code Playgroud)

在这里, master~ 1将您的文件夹从您的主分支恢复为“1”修订版。

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


Shy*_*gar 8

对我来说,由于不相关的问题,我暂时删除了一个文件夹。我没有尝试从备份中恢复它,而是运行git restore folder/并将其恢复到分支原来的状态。


Iva*_*tyk 5

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

git checkout -- removed_directory
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

  • `git checkout-remove_directory` [不起作用](http://pastebin.com/0UKh07Fe) (3认同)

gma*_*man 5

唯一对我有用的是在另一个文件夹中签出 repo。假设当前的 repo 在/home/me/current.

然后我做了

git clone /home/me/current /home/me/temp
Run Code Online (Sandbox Code Playgroud)

这使 repo 的单独克隆在 /home/me/temp

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

git reset --hard commit-hash-before-delete
Run Code Online (Sandbox Code Playgroud)

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

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder
Run Code Online (Sandbox Code Playgroud)

并删除临时文件夹

rm -rf /home/me/temp
Run Code Online (Sandbox Code Playgroud)

的例子

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*
Run Code Online (Sandbox Code Playgroud)

不工作

$ 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.
Run Code Online (Sandbox Code Playgroud)

其他例子如

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

破坏性不仅仅是删除的文件。任何其他更改也将丢失。

相似地

git reset --hard some-commit
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

git restore --staged some/deleted/folder
Run Code Online (Sandbox Code Playgroud)