假设我在Git存储库中。 我删除文件并提交更改。 我继续工作并做出更多承诺。 然后,我发现需要还原该文件。

我知道我可以使用git checkout HEAD^ foo.bar来签出文件,但是我真的不知道何时删除该文件。

  1. 找到删除给定文件名的提交的最快方法是什么?
  2. 将文件恢复到我的工作副本中最简单的方法是什么?

我希望我不必手动浏览日志,签出给定SHA的整个项目,然后手动将该文件复制到我的原始项目签出中。


#1楼

查找影响给定路径的最后一次提交。 由于该文件不在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"

#2楼

在我们的案例中,我们意外地删除了一次提交中的文件,而在某些提交之后,我们意识到了自己的错误,想取回所有已删除的文件,而不是找回那些已修改的文件。

基于Charles Bailey的出色回答,这是我的一线笔:

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)

#3楼

要恢复已删除并提交的文件:

git reset HEAD some/path
git checkout -- some/path

它已在Git 1.7.5.4版上进行了测试。


#4楼

在许多情况下,将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

就像其他人在我面前说过的一样。

现在,文件将恢复到删除前的状态。 如果要保留它,请记住将其重新提交到工作树中。


#5楼

user@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

#6楼

基于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

避免危机。


Robert Dailey 在评论中建议使用以下别名:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

jegan添加了评论 :

为了从命令行设置别名,我使用了以下命令:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""

#7楼

git checkout /path/to/deleted.file

#8楼

因此,我必须从特定的提交中还原一堆已删除的文件,并使用两个命令对其进行管理:

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清除,我需要还原文件,然后取消暂存。 我有数百个要还原的文件,为每个文件手动键入内容,就像其他示例中那样太慢了。


#9楼

我遇到了这个问题,希望还原刚刚删除但尚未提交更改的文件。 万一您发现自己处于这种情况下,您需要做的只是以下几点:

git checkout HEAD -- path/to/file.ext


#10楼

如果您知道删除文件的提交,请运行以下命令,其中<SHA1_deletion>是删除文件的提交:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

管道之前的部分列出了在提交中删除的所有文件; 它们都是从上一次提交中检出以还原它们。


#11楼

如果知道文件名,这是使用基本命令的简单方法:

列出该文件的所有提交。

git log -- path/to/file

最后一个提交(最顶部)是删除文件的提交。 因此,您需要还原倒数第二个提交。

git checkout {second to last commit} -- path/to/file

#12楼

如果您仅进行更改并删除了文件但不提交,那么现在您分手了更改

git checkout -- .

但是删除的文件没有返回,您只需执行以下命令:

git checkout <file_path>

而且,您的文件又回来了。


#13楼

要恢复文件夹中所有已删除的文件,请输入以下命令。

git ls-files -d | xargs git checkout --

#14楼

git undelete path/to/file.ext

  1. 将其放入您的.bash_profile (或打开命令外壳程序时加载的其他相关文件)中:

     git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -' 
  2. 然后使用:

     git undelete path/to/file.ext 

此别名首先检查以找到该文件存在的最后提交,然后从该文件存在的最后提交进行git checkout该文件路径。 资源


#15楼

我有同样的问题。 不知不觉中,我创建了一个悬空的提交

列出悬空提交

git fsck --lost-found

检查每个悬空的提交

git reset --hard <commit id>

当我移至悬空的提交时,我的文件重新出现。

git status的原因:

“HEAD detached from <commit id where it detached>”


#16楼

$ git log --diff-filter=D --summary  | grep "delete" | sort

#17楼

简单而精确-

首先,通过-获得最新的稳定提交,其中包含该文件-

git log

假设您找到$ commitid 1234567 ...,然后

git checkout <$commitid> $fileName

这将还原该提交中的文件版本。


#18楼

实际上,这个问题直接与Git有关,但是像我这样的WebStorm除了了解git cli命令之外,还使用WebStorm VCS之类的GUI工具。

我右键单击包含已删除文件的路径,然后转到Git ,然后单击“ Show History

VCS工具显示了所有修订版本,我可以看到每个修订的所有提交和更改。

然后,选择我的朋友删除PostAd.js文件的提交。 现在看下面:

现在,我可以看到我想要删除的文件。 我只需双击文件名即可恢复。

我知道我的答案不是Git命令,但是对于初学者和专业开发人员来说,它是快速,可靠且容易的。 Webstorm VCS工具非常棒,非常适合与Git一起使用,不需要任何其他插件或工具。


#19楼

我知道这是一个旧线程,但是您总是可以git revert了文件的提交。 ( 这假定删除是提交中的唯一更改。

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700deleted readme.md

而且,如果您继续进行工作,后来又意识到您不想提交删除提交,则可以使用还原它。

> git revert 2994bd

现在git log显示:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700Revert "deleted readme"This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

并且readme.md已还原到存储库中。


#20楼

使用以下代码将以前的文件检索到本地目录时,我也遇到此问题

git checkout <file path with name>

下面的例子为我工作

git checkout resources/views/usaSchools.blade.php

谢谢


#21楼

查找删除您的文件的提交:

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-restore doc for git 2.23.0


#22楼

我有这个解决方案 。

  1. 使用以下方法之一获取删除文件的提交ID。

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* #如果您几乎不记得任何内容,建议使用
  2. 您应该得到类似以下内容:

提交bfe68bd117e1091c96d2976c99b3bcc8310bebe7作者:Alexander Orlov日期:2011年5月12日星期四23:44:27 +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 。 现在使用提交ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7做:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

由于提交ID引用了已删除文件的提交,因此您需要引用bfe68b之前的提交,您可以通过添加^1来进行引用。 这意味着:在bfe68b之前给我提交。


#23楼

如果您疯了,请使用git-bisect 。 这是做什么的:

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-bisect的“运行”命令将使用二进制搜索来自动找到测试失败的第一个提交。 它从给定范围(从好到坏)的一半开始,并根据指定测试的结果将其减半。

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 .

#24楼

  1. 使用git log --diff-filter=D --summary获取所有已删除文件和已删除文件的提交;
  2. 使用git checkout $commit~1 path/to/file.ext还原删除的文件。

其中$commit是您在步骤1中找到的提交的值,例如e4cf499627

在Git存储库中查找并恢复已删除的文件相关推荐

  1. linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件

    我们都知道寻找文件而不是找到文件的感觉,即使是在垃圾桶里也是如此. 由于TestDisk ,文件和数据丢失带来的创伤应该结束 - 这是一个免费的开源软件,最初设计用于恢复内存分区并使不可引导的磁盘再次 ...

  2. photorec_如何在Linux / Ubuntu中使用PhotoRec恢复已删除的文件

    photorec Accidentally deleted files or photos? In this tutorial, we'll learn how to recover deleted ...

  3. 将子目录分离(移动)到单独的Git存储库中

    我有一个Git存储库,其中包含许多子目录. 现在,我发现一个子目录与另一个子目录无关,应该将其分离到单独的存储库中. 如何在保留子目录中文件历史记录的同时执行此操作? 我想我可以制作一个克隆并删除每个 ...

  4. 如何仅从git存储库中稀疏签出单个文件?

    如何从git仓库中检出一个文件? #1楼 git checkout branch_or_version-路径/文件 示例: git checkout HEAD -- main.c #2楼 如果您已经有 ...

  5. git 初始化git存储库_什么不保存到Git存储库中

    git 初始化git存储库 You should not commit these four types of files into your Git repository. 您不应将这四种类型的文件 ...

  6. 如何从 Git 存储库中删除文件?

    问: 如何从我的存储库中删除 "file1.txt"? 答1: huntsbot.com – 程序员副业首选,一站式外包任务.远程工作.创意产品分享订阅平台. 使用 git rm. ...

  7. 从Git存储库中删除文件而不从本地文件系统中删除它

    我的初始提交包含一些日志文件. 我已将*log添加到我的.gitignore ,现在我想从我的存储库中删除日志文件. git rm mylogfile.log 将从存储库中删除文件,但也将从本地文件系 ...

  8. git-secret:在 Git 存储库中加密和存储密钥(下)

    在之前的文章中(点击此处查看上一篇文章),我们了解了如何识别包含密钥的文件,将密钥添加到 .gitignore ,通过 git-secret 进行加密,以及将加密文件提交到存储库.在本篇文章中,将带你 ...

  9. Linux 系统中恢复已删除的文件

    注:文章内容仅用于本人日常学习记录 Linux 系统中恢复已删除的文件 当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件.不过,幸运的是文件是可以通过一 ...

最新文章

  1. int.Parse()和Convert.ToInt32之间的主要区别是什么
  2. linux cpu %us,Linux top里面%CPU和us%的解释
  3. MySQL中MyISAM 与innoDB的区别(转)
  4. Android 开发有什么好的架构么?
  5. Matlab实用程序--图形应用-交互式图形
  6. 别羡慕别人的舒服,静下心来坚持奋斗!!!
  7. 学习OpenCV——ORB简化版Location加速版
  8. 修改手机屏幕刷新率_240Hz 超高刷新率,这手机屏幕比电竞专业屏还牛
  9. 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)
  10. 1055. 集体照 (25)-PAT乙级真题
  11. duilib的通用窗口类WindowImplBase
  12. 信息系统项目的可行性研究报告
  13. Node-red初级入门
  14. 携手网易打造世界杯主题房 YUNIK HOTEL玩转兴趣社交新场景
  15. 在html中向下的箭头怎样写,word换行向下的箭头怎么打
  16. 判断浏览器的cookie是否开启
  17. 电热毯UL964测试申请要求有哪些呢
  18. 《算法导论》第十二章——二叉搜索树
  19. Web前端学习笔记(五)--- 手风琴菜单
  20. 盲盒是怎么赚钱的?(盲盒App的盈利逻辑)

热门文章

  1. k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包
  2. 【每天学一点linux】后台进程不打印日志
  3. PINVOKE.NET: Do interop the wiki way!
  4. Windows服务器SYSTEM权限Webshell无法添加3389账户情况突破总结
  5. [Unity热更新]04.卸载方式
  6. 读书笔记:线上性能问题初步排查方法
  7. java时间计算,获取某月第一天和最后一天
  8. matlab 图片批量读取
  9. calendar的使用注意点
  10. 【Vegas2007】11月23日-螃蟹的做法(蒸煮两法)