假设我在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

就像其他人在我面前所说的那样。

文件现在将恢复到删除前的状态。如果你想保留它,记得将它重新提交到工作树中。

其他回答

在许多情况下,将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

就像其他人在我面前所说的那样。

文件现在将恢复到删除前的状态。如果你想保留它,记得将它重新提交到工作树中。

这是我发现的最简单的解决方案,如果您只想在master中恢复相同的文件:

git checkout master -- path/to/File.java

为了使用Git恢复所有删除的文件,您还可以执行以下操作:

git checkout $(git ls-files --deleted)

其中git-ls-files-deleted列出了所有删除的文件,gitcheckout$(git命令)在参数中恢复文件列表。

如果您知道文件名,这是使用基本命令的简单方法:

列出该文件的所有提交。

git log -- path/to/file

最后一次提交(最顶层)是删除文件的提交。因此,您需要恢复倒数第二次提交。

git checkout {second to last commit} -- path/to/file

获取已删除文件的所有提交以及已删除的文件:git-log--diff-filter=D--摘要记下所需的提交散列,例如e4e6d4d5e5c59c69f3bd7be2。将删除的文件从之前的一次提交(~1)还原到上面确定的提交(e4e6d4d5e5c59c69f3bd7be2):git签出e4e6d4d5e5c59c69f3bd7be2~1路径/to/file.ext注意~1。