假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
如果您知道删除文件的提交,请运行以下命令:
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
管道之前的部分列出了提交中删除的所有文件;它们都是从上一次提交中签出以恢复它们。
其他回答
git取消删除路径/to/file.ext
将其放入.bash_profile(或打开命令shell时加载的其他相关文件):git-config--全局别名取消删除'!sh-c“git checkout$(git rev list-n 1 HEAD--$1)^--$1”-'然后使用:git取消删除路径/to/file.ext
该别名首先检查以查找该文件存在的最后一次提交,然后在Git中签出该文件所在的最后一个提交的文件路径。来源
我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ --
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD
(注意每个命令末尾的尾随空格。)
这些文件已添加到.gitignore文件中,然后用gitrm清除。我需要恢复这些文件,但随后又将其拆下。我有数百个文件要恢复,像其他示例中那样手动为每个文件键入内容太慢了。
在许多情况下,将coreutils(grep、sed等)与Git结合使用可能很有用。我已经非常熟悉这些工具,但Git就不那么熟悉了。如果我想搜索已删除的文件,我会做以下操作:
git log --raw | grep -B 30 $'D\t.*deleted_file.c'
当我找到修订/提交时:
git checkout <rev>^ -- path/to/refound/deleted_file.c
就像其他人在我面前所说的那样。
文件现在将恢复到删除前的状态。如果你想保留它,记得将它重新提交到工作树中。
要还原已删除并提交的文件,请执行以下操作:
git reset HEAD some/path
git checkout -- some/path
它在Git 1.7.5.4版本上进行了测试。
您可以签出已删除的文件:
git checkout
输出
D index.html
要恢复它,请执行以下操作:
git restore index.html
如果您删除了多个文件,并且需要恢复所有使用:
git restore .
参见Gif图像