假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
查找影响给定路径的最后一次提交。由于该文件不在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 log -- path/to/file
最后一次提交(最顶层)是删除文件的提交。因此,您需要恢复倒数第二次提交。
git checkout {second to last commit} -- path/to/file
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 -- <file>
您可以使用下面的命令获取工作树中所有已删除文件的列表。
$ git ls-files --deleted
如果已提交删除,请找到发生删除的位置,然后从此提交中恢复文件。
$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>
如果您正在查找要恢复的文件路径,以下命令将显示所有已删除文件的摘要。
$ git log --diff-filter=D --summary
如果你疯了,用二分法。下面是要做的:
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 .
我也有同样的问题。在不知情的情况下,我创建了一个悬空的承诺。
列出悬空提交
git fsck—找到丢失
检查每个悬空提交
git reset--hard<commit id>
当我移动到悬空提交时,我的文件再次出现。
git状态,原因如下:
“HEAD从<commit id where it detached>分离”