在 Git 存储库中恢复已删除的文件夹
Restore a deleted folder in a Git repo
我删除了一个文件夹中的所有内容,但该文件夹是空的。我的远程仓库中还有一份副本。但是,当我执行 git pull
时,它并没有放回已删除的文件,难道不应该这样做吗?
所以我做了一些研究,发现您可以通过以下方式还原文件
git checkout <revision> -- <name of file>
但这只适用于文件。
如何检索目录中的所有文件?
如果您不指定特定文件,您应该能够提取特定提交的全部内容。像:git checkout 264794319e9695ba843cd6
(假设哈希让你的所有文件都处于正确的状态)。
pull
不恢复文件的原因是 git 将您的删除视为最近的更改,将其应用在您正在提取的任何内容之上。
(我建议在新分支中进行试验。)
如果您尚未提交更改,您可以还原内容或目录:
git checkout -- removed_directory
如果您想还原所有更改,请执行以下操作:
git reset --hard HEAD
您可以对文件执行的所有操作,也可以对文件夹执行。
另请注意Find and restore a deleted file in a Git repository
文件已从工作树中删除但尚未提交:
如果您还没有为您的更改编制索引(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>
对于未提交的删除,就这么简单:
git 重置 HEAD rel/path/to/deleted/directory/*
唯一对我有用的是检出另一个文件夹中的存储库。假设当前 repo 在 /home/me/current
中。
然后我做了
git clone /home/me/current /home/me/temp
这会在 /home/me/temp
中创建一个单独的 repo 克隆
我现在可以去 /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
之后丢失任何提交
从 git 2.24.0 开始,有一个实验性的新 git 命令:git restore
git restore --staged some/deleted/folder
您可以使用 git 还原来还原文件或文件夹。
git restore --source master~1 "PATH_IN_YOUR_REPO"
在这里,master~1 将您的文件夹从您的 master 分支恢复为“1”版本。
如果您只是想恢复已删除的文件夹,并且在删除后还有其他提交,那么您也可以直接转到 github.com 上的项目。
从 github.com,转到包含您的文件夹的最后一次提交。您应该看到提交消息,并且在右侧有一个标有“浏览文件”的按钮。单击此按钮将带您到该提交阶段的所有文件。
您可以从那里克隆代码或将代码下载为 zip。
对我来说,由于不相关的问题,我暂时删除了一个文件夹。我没有尝试从备份中恢复它,而是 运行 git restore folder/
并将其恢复到 b运行ch 最初的状态。
如果您必须在没有 Git 命令的情况下进行恢复,请按照以下步骤进行操作
如果你有 Github 桌面它会让事情变得简单
如果没有,请安装并登录
转到文件
克隆存储库
Select 存储你的 Repo
点击历史
- 右键单击用于删除的 Commit Folder/File
Select 还原提交中的更改 选项
现在只需点击 Push Origin
- 一切就绪!您已恢复已删除的 File/Folder
您可以在您的存储库中查看它
我删除了一个文件夹中的所有内容,但该文件夹是空的。我的远程仓库中还有一份副本。但是,当我执行 git pull
时,它并没有放回已删除的文件,难道不应该这样做吗?
所以我做了一些研究,发现您可以通过以下方式还原文件
git checkout <revision> -- <name of file>
但这只适用于文件。
如何检索目录中的所有文件?
如果您不指定特定文件,您应该能够提取特定提交的全部内容。像:git checkout 264794319e9695ba843cd6
(假设哈希让你的所有文件都处于正确的状态)。
pull
不恢复文件的原因是 git 将您的删除视为最近的更改,将其应用在您正在提取的任何内容之上。
(我建议在新分支中进行试验。)
如果您尚未提交更改,您可以还原内容或目录:
git checkout -- removed_directory
如果您想还原所有更改,请执行以下操作:
git reset --hard HEAD
您可以对文件执行的所有操作,也可以对文件夹执行。
另请注意Find and restore a deleted file in a Git repository
文件已从工作树中删除但尚未提交:
如果您还没有为您的更改编制索引(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>
对于未提交的删除,就这么简单:
git 重置 HEAD rel/path/to/deleted/directory/*
唯一对我有用的是检出另一个文件夹中的存储库。假设当前 repo 在 /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
从 git 2.24.0 开始,有一个实验性的新 git 命令:git restore
git restore --staged some/deleted/folder
您可以使用 git 还原来还原文件或文件夹。
git restore --source master~1 "PATH_IN_YOUR_REPO"
在这里,master~1 将您的文件夹从您的 master 分支恢复为“1”版本。
如果您只是想恢复已删除的文件夹,并且在删除后还有其他提交,那么您也可以直接转到 github.com 上的项目。
从 github.com,转到包含您的文件夹的最后一次提交。您应该看到提交消息,并且在右侧有一个标有“浏览文件”的按钮。单击此按钮将带您到该提交阶段的所有文件。
您可以从那里克隆代码或将代码下载为 zip。
对我来说,由于不相关的问题,我暂时删除了一个文件夹。我没有尝试从备份中恢复它,而是 运行 git restore folder/
并将其恢复到 b运行ch 最初的状态。
如果您必须在没有 Git 命令的情况下进行恢复,请按照以下步骤进行操作
如果你有 Github 桌面它会让事情变得简单
如果没有,请安装并登录
转到文件
克隆存储库
Select 存储你的 Repo
点击历史
- 右键单击用于删除的 Commit Folder/File
Select 还原提交中的更改 选项
现在只需点击 Push Origin
- 一切就绪!您已恢复已删除的 File/Folder 您可以在您的存储库中查看它