假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
您总是可以git还原删除文件的提交。(这假设删除是提交中唯一的更改。)
> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date: Thu May 9 11:11:06 2019 -0700
deleted readme.md
如果您继续工作,并且后来意识到您不想提交删除提交,则可以使用以下方法进行恢复:
> git revert 2994bd
现在git日志显示:
> git log
Author: Dave <dave@domain.com>
Date: Thu May 9 11:17:41 2019 -0700
Revert "deleted readme"
This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.
readme.md已恢复到存储库中。
其他回答
查找删除文件的提交:
git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '
样本输出:
4711174
从Git 2.23开始,实际上有一个restore命令。它仍然是实验性的,但为了恢复您在提交中删除的内容(在本例中为4711174),您可以键入:
git restore --source=4711174^ path/to/file
注意提交id之后的^,因为我们希望从删除文件之前的提交中恢复一些内容。
--source参数告诉restore命令在哪里查找要还原的文件,它可以是任何提交,甚至可以是索引。
参见:git 2.23.0的git restore doc
如果您知道删除文件的提交,请运行以下命令:
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
管道之前的部分列出了提交中删除的所有文件;它们都是从上一次提交中签出以恢复它们。
您总是可以git还原删除文件的提交。(这假设删除是提交中唯一的更改。)
> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date: Thu May 9 11:11:06 2019 -0700
deleted readme.md
如果您继续工作,并且后来意识到您不想提交删除提交,则可以使用以下方法进行恢复:
> git revert 2994bd
现在git日志显示:
> git log
Author: Dave <dave@domain.com>
Date: Thu May 9 11:17:41 2019 -0700
Revert "deleted readme"
This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.
readme.md已恢复到存储库中。
要还原已删除并提交的文件,请执行以下操作:
git reset HEAD some/path
git checkout -- some/path
它在Git 1.7.5.4版本上进行了测试。
简单而精确-
首先,获取一个最新的稳定提交,其中您可以通过-
git log
假设您找到$commitid 1234567…,然后
git checkout <$commitid> $fileName
这将还原该提交中的文件版本。