假设我在一个Git仓库中。我删除了一个文件并提交了这次更改。然后,我继续工作并做出了一些更多的提交。然后,我发现需要恢复之前删除的那个文件。
我知道可以使用git checkout <commit> -- filename.txt
命令来检出一个文件,但我不知道何时删除了该文件。
- 如何找到删除指定文件的提交?
- 如何将该文件恢复回我的工作副本?
假设我在一个Git仓库中。我删除了一个文件并提交了这次更改。然后,我继续工作并做出了一些更多的提交。然后,我发现需要恢复之前删除的那个文件。
我知道可以使用git checkout <commit> -- filename.txt
命令来检出一个文件,但我不知道何时删除了该文件。
git undelete path/to/file.ext
将以下代码添加到您的 .bash_profile
文件中(或者其他在打开命令行时加载的相关文件):
git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
然后使用:
git undelete path/to/file.ext
该别名首先检查文件最后存在的提交,然后从该文件最后存在的提交处检出该文件路径。来源。git checkout /path/to/deleted.file
在许多情况下,将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 show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ --
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD
(注意每个命令末尾的空格。)
这些文件已经被添加到.gitignore文件中并通过git rm
清除。我需要恢复这些文件,然后取消暂存它们。我有数百个需要恢复的文件,如果像其他示例中那样手动输入每个文件将会太慢。
我曾经有同样的问题。在不知情的情况下,我创建了一个悬空提交(dangling commit)。
列出悬空提交:
git fsck --lost-found
检查每个悬空提交:
git reset --hard <commit id>
当我转移到悬空提交时,我的文件重新出现了。
运行git status
命令可查看原因:
“HEAD 分离于 <分离的提交 id>”
找到删除你的文件的提交:
git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '
4711174
git restore --source=4711174^ path/to/file
--source
参数告诉restore
命令在哪里查找要还原的文件,可以是任何提交,甚至是索引。git log --diff-filter=D --oneline -- path/to/file | cut -d ' ' -f 1
- Minimuluser@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory
恢复已删除的文件:
user@bsd:~/work/git$ git checkout
D .slides.tex.swp
D slides.tex
user@bsd:~/work/git$ git checkout slides.tex
user@bsd:~/work/git$ ls slides.tex
slides.tex
优点:以下方法适用于即使文件/文件夹已从您的垃圾箱或回收站中删除的场景。
I. 如果您尚未索引(git add)您的更改,您可以还原目录的内容:
git restore -- path/to/folder_OR_file
II. 如果删除已被索引,您应该首先重置它:
git reset -- path/to/folder_OR_file
然后执行 git restore path/to/folder_OR_file
git log --diff-filter=D --summary
获取已删除文件/文件夹的提交详情;git checkout $commit~1 path/to/folder_OR_file
来还原已删除的文件/文件夹。
其中,$commit
是您在第1步找到的提交的SHA值,例如c7578994。git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
git log --diff-filter=D -- path/to/file
- titaniumdecoygit checkout deletedFile
命令可以恢复该文件。但这并不是本问题所要求的;本问题是关于如何恢复一个在很多次提交之前被删除的文件。 - Mark Amery