假设我在一个Git仓库中。我删除了一个文件并提交了这次更改。然后,我继续工作并做出了一些更多的提交。然后,我发现需要恢复之前删除的那个文件。
我知道可以使用git checkout <commit> -- filename.txt
命令来检出一个文件,但我不知道何时删除了该文件。
- 如何找到删除指定文件的提交?
- 如何将该文件恢复回我的工作副本?
假设我在一个Git仓库中。我删除了一个文件并提交了这次更改。然后,我继续工作并做出了一些更多的提交。然后,我发现需要恢复之前删除的那个文件。
我知道可以使用git checkout <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 checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
我改用bash,它就可以正常运行了。 - zoraserror: pathspec <filename> did not match any file(s) known to git.
解决方法是使用Git Bash。 - donturnergit checkout <deleting-commit>~1 -- <file-path>
git log -- *文件名的一部分*
。感谢 $commit~1
。 - bgs$commit~1
的意思是你需要添加提交的名称,类似于 $commit
所代表的 1d0c9ef6eb4e39488490543570c31c2ff594426c
。请注意不要改变原有的意思,并使其更加通俗易懂。 - Eugene恢复文件夹中所有已删除的文件:
git ls-files -d | xargs git checkout --
git
变得如此困难。 - jwwls-files
子命令很方便,但似乎无法处理使用git rm
删除(即已暂存)甚至提交的文件,这正是OP所问的。 - MarkHugit
在其实用性方面几乎是无与伦比的,但学习起来也因其复杂而声名狼藉。git
学习曲线中相当大一部分原因是由于其不一致/不直观的用户界面。就我个人而言,在学习困难的东西时,看到其他(有能力的)人也努力地尝试弄清楚它,会让我感到安慰。 - Matthew StrasiottoHEAD
提交中存在的文件,你可以使用以下命令来恢复它:git checkout HEAD -- path/to/file.ext
如果你很着急,可以使用git-bisect
。以下是具体做法:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
现在是运行自动化测试的时候了。Shell命令'[ -e foo.bar ]'
如果foo.bar
存在则返回0,否则返回1。git-bisect
命令的"run"将使用二分查找自动找到第一个测试失败的提交。它从给定范围(从好的到坏的)的中间开始,并根据指定测试的结果将其分成两半。
git bisect run '[ -e foo.bar ]'
现在你已经到达删除该文件的提交点。从这里,你可以回到未来并使用git-revert
命令撤消更改。
git bisect reset
git revert <the offending commit>
或者你可以回到上一个提交,手动检查损坏的部分:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
git bisect run '[ -e foo.bar ]'
吗? - avdgaag根据bonyiii的回答(已点赞)和我自己关于“将参数传递给Git别名命令”的回答,我的新最爱别名是:
git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'
我丢失了一个文件,几次提交之前不小心删除了它?
快速解决:
git restore my_deleted_file
git restore
(!)的实验性命令。Robert Dailey在评论中提出了以下别名:
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
并且{{link1:jegan}}在评论中添加了{{link2:in the comments}}:
为了从命令行设置别名,我使用了这个命令:
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
。(说明:该命令可用于Git版本控制系统中,用于还原某个文件到指定的提交版本。) - void.pointerExpansion of alias 'restore' failed; '!git' is not a git command
- basickarl如果你知道文件名,使用基本命令就可以轻松完成:
列出该文件的所有提交记录。
git log -- path/to/file
最后一次提交(顶部)是删除该文件的提交。所以你需要恢复倒数第二次提交。
git checkout {second to last commit} -- path/to/file
恢复已删除且已提交的文件:
git reset HEAD some/path
git checkout -- some/path
这是在Git版本1.7.5.4上进行测试的。
git add -A
提交已删除文件而进行显式分段的开发人员非常有效,但是这样恢复的文件仍处于未提交阶段。 - Fedir RYKHTIK我有这个解决方案
使用以下任一方式获取文件被删除的提交ID。
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# 推荐如果您几乎记不起任何东西你应该得到像下面这样的结果:
commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Author: Alexander Orlov Date: Thu May 12 23:44:27 2011 +0200
replaced deprecated GWT class - gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script
提交记录 3ea4e3af253ac6fd1691ff6bb89c964f54802302 作者:Alexander Orlov 日期:2011年5月12日 星期四 22:10:22 +0200
3. 现在使用提交编号 bfe68bd117e1091c96d2976c99b3bcc8310bebe7 进行操作:
git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java
由于提交 ID 引用了已经删除文件的提交,所以您需要引用 bfe68b 之前的提交,可以通过添加
^1
来实现。这意味着:给我 bfe68b 之前的提交。
如果您只修改了文件并删除了一些内容,但没有提交(commit),现在您想放弃这些更改
git checkout -- .
但是您删除的文件不会自动恢复,您只需执行以下命令:
git checkout <file_path>
瞬间,您的文件就回来了。
git log --diff-filter=D -- path/to/file
- titaniumdecoygit checkout deletedFile
命令可以恢复该文件。但这并不是本问题所要求的;本问题是关于如何恢复一个在很多次提交之前被删除的文件。 - Mark Amery