假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
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 checkout
输出
D index.html
要恢复它,请执行以下操作:
git restore index.html
如果您删除了多个文件,并且需要恢复所有使用:
git restore .
参见Gif图像
如果尚未提交删除,下面的命令将在工作树中恢复已删除的文件。
$ git checkout -- <file>
您可以使用下面的命令获取工作树中所有已删除文件的列表。
$ git ls-files --deleted
如果已提交删除,请找到发生删除的位置,然后从此提交中恢复文件。
$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>
如果您正在查找要恢复的文件路径,以下命令将显示所有已删除文件的摘要。
$ git log --diff-filter=D --summary
如果您知道删除文件的提交,请运行以下命令:
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
管道之前的部分列出了提交中删除的所有文件;它们都是从上一次提交中签出以恢复它们。
优点:以下方法确实适用于文件/文件夹甚至从垃圾箱或回收站删除的情况。
文件/文件夹已从工作树中删除,但尚未提交:
I.如果您尚未对更改进行索引(gitadd),则可以还原目录的内容:
git restore--路径/to/folder_OR_file
二、如果删除已被索引,则应首先重置:
git reset—路径/to/folder_OR_file
然后执行,git restore path/to/folder_OR_file
文件/文件夹在过去的某些提交中被删除:
使用git-log--diff-filter=D--summary获取删除文件/文件夹的提交的详细信息;使用gitcheckout$commit~1path/to/folder_OR_file还原删除的文件/文件夹。其中$commit是您在步骤1中找到的提交的sha值,例如c7578994
如果你疯了,用二分法。下面是要做的:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
现在是运行自动测试的时候了。如果foo.bar存在,shell命令“[-e foo.bar]”将返回0,否则返回1。git平分的“run”命令将使用二进制搜索自动查找测试失败的第一个提交。它从给定范围的一半开始(从好到坏),并根据指定测试的结果将其减半。
git bisect run '[ -e foo.bar ]'
现在,您在提交时删除了它。从这里,您可以跳回到未来并使用git-restore撤消更改,
git bisect reset
git revert <the offending commit>
或者您可以返回一次提交并手动检查损坏:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .