0


如何在 Git 存储库中查找和恢复已删除的文件?

问:

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

我知道我可以使用 git checkout – filename.txt 签出文件,但我不知道该文件何时被删除。

如何找到删除给定文件名的提交?如何将该文件恢复到我的工作副本中?

答1:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

查找影响给定路径的最后一个提交。由于该文件不在 HEAD 提交中,因此之前的提交必须已将其删除。

git rev-list -n 1HEAD--

然后使用插入符号 (^) 签出之前提交时的版本:

git checkout ^--

或者在一个命令中,如果 $file 是有问题的文件。

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

如果您使用 zsh 并启用了 EXTENDED_GLOB 选项,则插入符号将不起作用。您可以改用 ~1。

git checkout $(git rev-list -n 1HEAD--"$file")~1--"$file"
棘手的一点是使用 ^ 后缀在之前检查提交。谢谢。
出于某种原因,这在 zsh 中不起作用。 ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ 我改用 bash &不过效果很好。
从 Windows 命令行我得到一个错误。 error: pathspec did not match any file(s) known to git.。解决方案是使用 git bash。
@zoras zsh 我相信在 '^' 上有它自己的扩展,但您可以使用 '~1' 的替代语法:git checkout ~1 -- ~X 允许您在指定提交之前指定 X 次提交,所以 ~1 是之前的提交, ~2 是之前的两次提交,等等
在 windows cmd 提示符下,^ 字符是转义字符!因此,在 cmd 上,您必须输入 ^^ 来告诉 cmd 您想要一个文字 ^ 并且您不会在它之后转义其他内容。许多人遇到的情况是 ^ 后面跟着一个空格。所以 cmd 认为你正在转义空间——这只会产生一个空格字符。因此,当 git 获取 cli 参数时,它会看到 SHA1 和 not SHA1^。这真的很烦人。 ~ 不是转义字符,所以它仍然有效。 (PS。如果您认为 googlers 会想要此信息,请点赞此评论)

答2:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

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

好奇,~1 指的是什么?
@tommy - 波浪号规范将为您提供命名 commit 的第 n 个孙子。有关详细信息,请参阅 book.git-scm.com/4_git_treeishes.html。
这是迄今为止最简单和直观的方法。 git log -- *PartOfMyFileName*。感谢您的$commit~1
git checkout $commit~1 filename 语法适用于单个文件,也适用于整个目录。即:从 sha 12345 恢复 ./images 中所有已删除的图像:git checkout 12345~1 images。感谢您的回答!
@Alexar $commit~1 表示您应该添加提交的名称。 $commit 所在的位置类似于 1d0c9ef6eb4e39488490543570c31c2ff594426c。

答3:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

git ls-files -d | xargs git checkout --
文件通过管道传输到哪里?我看没有变化。
这可能是最简单的方法。即使是最简单的任务,git 也变得多么困难。
ls-files 子命令很方便,但似乎不适用于已使用 git rm 删除的文件,即暂存,更不用说提交了,这是 OP 所要求的。
@RomainValeri - 现在是 2019 年。这些工具对我有用。我不为工具工作。如果需要学习,那么设计就被破坏了。
@RomainValeri ,@jww 你都是对的。 git 在实用性方面几乎是无与伦比的,而且学习起来也非常复杂。 git 学习曲线的很大一部分是由于用户界面不一致/不直观。就个人而言,当我学习一些困难的东西时,让我放心的一件事是看到其他(有能力的)人也很难弄清楚

答4:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

我来这个问题是为了恢复我刚刚删除但尚未提交更改的文件。万一您发现自己处于这种情况,您需要做的就是以下几点:

git checkout HEAD – path/to/file.ext

答5:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

git bisect start
git bisect bad
git bisect good 

现在是时候运行自动化测试了。如果 foo.bar 存在,shell 命令 ‘[ -e foo.bar ]’ 将返回 0,否则返回 1。 git-bisect 的“运行”命令将使用二进制搜索自动查找测试失败的第一个提交。它从给定范围(从好到坏)的中间开始,并根据指定测试的结果将其减半。

git bisect run '[-e foo.bar ]'

现在你在提交删除它。从这里,您可以跳回到未来并使用 git-revert 撤消更改,

git bisect reset
git revert 

或者您可以返回一次提交并手动检查损坏情况:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
您能否详细说明git bisect run '[ -e foo.bar ]'?
如果无法自动检查,您也可以手动使用好坏。请参见 bisect 手册页。
@avdgaag git bisect run 告诉 Git 通过在单词 'run' 后面运行命令来自动进行二分,其中对于 good 版本,该命令必须返回 0(有关详细信息,请参阅 git help bisect)。 '[ -e foo.bar ]' 是用于测试文件 foo.bar 是否存在的标准表达式(实现通常在文件 /usr/bin/[ 中,通常硬链接到 /usr/bin/test)并且单引号用于将所有内容作为单个命令行参数。
很好的主意。我尝试了这种方法,它在删除之前确定了一个提交,但不是实际删除文件的提交。在另一个测试中,它在删除之前确定了 2 个提交。
疯狂的?也许。但是 bisect 是帮助找到引入错误的好方法,因此无论如何学习它都是一项有价值的技能。因此,尽管这里可能不是“正确”或最“正确”的方式,但它仍然是一个好主意,绝对值得 +1!

答6:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

我最喜欢的新别名,基于 bonyiii 的 answer(已投票)和我自己对“Pass an argument to a Git alias command”的回答:

git config alias.restore '!f(){ git checkout $(git rev-list -n 1HEAD-- $1)~1-- $(git diff --name-status $(git rev-list -n 1HEAD-- $1)~1| grep '^D'| cut -f 2);}; f'

我丢失了一个文件,在几次提交前被错误删除?快的:

git restore my_deleted_file

危机化解了。

警告,随着 Git 2.23(2019 年第三季度)的出现,experimental command 名为 git restore(!)。 所以重命名此别名(如下所示)。

Robert Dailey 提出 in the comments 以下别名:

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

jegan 添加 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"
@RobertDailey 看起来很棒!我已将您的别名包含在答案中以提高知名度。
为了从命令行设置别名,我使用了这个命令:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command

答7:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

列出该文件的所有提交。

git log -- path/to/file

最后一次提交(最顶层)是删除文件的那个。所以你需要恢复倒数第二个提交。

git checkout {second tolast commit}-- path/to/file
这是我见过的第一个非常简单的解决方案,下次我不必回到这里找到它。也许。
@Suncat2000 “倒数第二个”表示“先前提交的删除”,与“倒数第二个”相同。 en.wiktionary.org/wiki/penultimate#Synonyms

答8:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

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

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

那对我不起作用。结帐后,我得到 error: pathspec 'foo' did not match any file(s) known to git. 我确保文件名正确。 Git 版本 2.7.0
-1;这是错误的。这些命令将撤消尚未提交的删除(第一个取消暂存删除,如果已暂存,第二个则丢弃对文件的未暂存更改),但您在这里声称他们将恢复已提交删除文件,这根本不是真的,并且会因上面@wisbucky 的评论中的错误而失败。
@MarkAmery确实,我认为此命令对于那些没有为使用git add -A 提交已删除文件进行明确分期的开发人员来说效果很好,但因此恢复的文件仍处于未提交阶段。

答9:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

我有 this solution。

使用以下方法之一获取文件被删除的提交的 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 commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Author: Alexander Orlov Date: 2011 年 5 月 12 日星期四 22:10:22 +0200

  1. 现在使用提交 ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7 执行以下操作:
git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

由于提交 id 引用了文件已被删除的提交,您需要在 bfe68b 之前引用提交,您可以通过附加 ^1 来完成。这意味着:在 bfe68b 之前给我提交。

这与接受的答案相同,但有更多方法可以找到删除提交。我仍然喜欢接受的答案中采用的方法,但这些都是不错的选择。谢谢!
我假设首先检查已删除的文件然后(不更改它)提交它不会创建文件的副本。正确的? (我需要对图像执行此操作,并且副本会使存储库更大)

答10:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如果您只进行了更改并删除了一个文件,但没有提交它,现在您与您的更改分手了

git checkout --.

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

git checkout 

很快,你的文件又回来了。

答11:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

实际上,这个问题直接与 Git 有关,但像我这样的人使用 GUI 工具(如 WebStorm VCS)而不是了解 Git CLI 命令。

我右键单击包含已删除文件的路径,然后转到 Git,然后单击显示历史记录。

https://i.stack.imgur.com/7302F.png

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

https://i.stack.imgur.com/52bs4.png

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

https://i.stack.imgur.com/IKZv0.png

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

https://i.stack.imgur.com/UJlso.png

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

如果您不知道文件在哪个提交中被删除并且它发生在前一段时间,您将花费大量时间在提交后手动查看提交。

原文链接:https://www.huntsbot.com/qa/aLej/how-do-i-find-and-restore-a-deleted-file-in-a-git-repository?lang=zh_CN&from=csdn

huntsbot.com – 高效赚钱,自由工作

标签: git github iot

本文转载自: https://blog.csdn.net/kalman2019/article/details/128415604
版权归原作者 HuntsBot 所有, 如有侵权,请联系我们删除。

“如何在 Git 存储库中查找和恢复已删除的文件?”的评论:

还没有评论