假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
在许多情况下,将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 fsck—找到丢失
检查每个悬空提交
git reset--hard<commit id>
当我移动到悬空提交时,我的文件再次出现。
git状态,原因如下:
“HEAD从<commit id where it detached>分离”
简单而精确-
首先,获取一个最新的稳定提交,其中您可以通过-
git log
假设您找到$commitid 1234567…,然后
git checkout <$commitid> $fileName
这将还原该提交中的文件版本。
查找影响给定路径的最后一次提交。由于该文件不在HEAD提交中,因此前一次提交必须已将其删除。
git rev-list -n 1 HEAD -- <file_path>
然后在提交之前使用插入符号(^)签出版本:
git checkout <deleting_commit>^ -- <file_path>
或者在一个命令中,如果$file是有问题的文件。
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
如果使用zsh并启用EXTENDED_GLOB选项,则插入符号将不起作用。您可以改用~1。
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
您可以签出已删除的文件:
git checkout
输出
D index.html
要恢复它,请执行以下操作:
git restore index.html
如果您删除了多个文件,并且需要恢复所有使用:
git restore .
参见Gif图像
如果删除了最新HEAD提交中存在的文件,则可以使用以下方法恢复该文件:
git checkout HEAD -- path/to/file.ext