git restore 删除后未提交的已删除文件

Posted

技术标签:

【中文标题】git restore 删除后未提交的已删除文件【英文标题】:git recover deleted file where no commit was made after the delete 【发布时间】:2012-08-11 00:07:09 【问题描述】:

我删除了一些文件。

我还没有提交。

我想重置我的工作区以恢复文件。

我做了一个git checkout .

但是删除的文件还是不见了。

git status 显示:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

为什么git checkout . 不将工作区重置为HEAD

【问题讨论】:

如果您在删除后没有暂存更改,git checkout . 会正常工作。 @faizal 如果你这样做,你将丢失你的更改。 只需在 git gui 中按 Ctrl-J 在已删除的项目上。 git checkout -- cc.properties store/README store/cc.properties 看到这个答案:quora.com/… 【参考方案1】:

这对我有用:

git reset HEAD path/to/myfile.rb
git restore path/to/myfile.rb

【讨论】:

【参考方案2】:

这里有不同的案例作为帮助他人的参考:

如果删除未提交,下面的命令将在工作树中恢复被删除的文件。

$ git checkout -- <file>

您可以使用以下命令在工作树中获取所有已删除文件的列表

$ git ls-files --deleted

如果删除已已提交,请找到它发生的提交,然后从该提交中恢复文件。

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

它应该给你类似c46e81aa403ecb8a0f7a323a358068345 的东西,现在将这个提交哈希与父运算符 (^) 一起使用,如下所示:

$ git checkout <commit>^ -- <file>

例子:

$ git checkout c46e81aa403ecb8a0f7a323a358068345^ -- <file> 

如果您正在寻找要恢复的文件的路径,以下命令将显示所有已删除文件的摘要。

$ git log --diff-filter=D --summary

如果你只想显示文件列表:

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

【讨论】:

【参考方案3】:

较新的 git(我的是 2.27.0)更友好,实际命令显示在“git status”期间。 例如,如果你删除了文件 tf.c,那么

$ git status
...
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
      deleted:    tf.c

您可以使用“git restore tf.c”将其取回,就像它所说的那样。不再搜索!

【讨论】:

男人!你是对的,git status 告诉我们怎么做!从来没有注意到那些消息...【参考方案4】:

要一次自动恢复所有未分阶段的删除,无需指定每个路径:

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

要一次自动恢复所有分段删除,无需指定每个路径:

git status | grep 'deleted:' | awk 'print $2' | xargs git checkout --

【讨论】:

我不小心删除了 500 多个文件,这很有效,因为它还保留了我所有的有效更改(第一行是我使用的)。谢谢。 在成功构建后意外删除了 repo 的所有内容。第一个命令救了我的培根。 在这对我有用之前,我必须运行git status --long | grep 'deleted:' | awk 'print $2' | xargs git reset HEAD -- 非常有用,想保留未跟踪的文件但摆脱删除和修改,只是将 -d 更改为 -m 用于处理修改。 请注意,如果您的文件名/路径中有空格,这将不起作用。我认为git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout -- 会起作用。【参考方案5】:

我遇到了同样的问题,我在这里尝试的答案也没有一个对我有用。我正在使用 Intellij 并且我已经检查了一个新分支 git checkout -b minimalExample 通过删除一堆文件并修改项目中的一堆其他文件来在某些问题的新分支上创建一个“最小示例”。不幸的是,即使我没有在新的“最小示例”分支上提交任何更改,当我再次检查“原始”分支时,“最小示例”分支中的所有更改和删除都发生在“原来的”分支(或者它出现了)。根据git status,删除的文件刚刚从两个分支中消失。

幸运的是,即使 Intellij 警告我“删除这些文件可能无法完全恢复”,我还是能够通过右键单击项目来恢复它们(在实际删除它们的最小示例分支上)并选择本地历史 > 显示历史(然后在我想要的最近的历史项目上恢复)。 Intellij 恢复“最小示例”分支中的文件后,我将分支推送到原点。然后我切换回我的“原始”本地分支并运行git pull origin minimalExample 让它们也回到“原始”分支。

【讨论】:

【参考方案6】:

注意:先提交您希望保留的任何工作。

您可以重置您的工作区(并恢复已删除的文件)

git checkout ./*

【讨论】:

仅供参考...此命令删除了我所有的工作文件并且没有恢复已删除的文件..注意 这就是您使用此命令重置工作区的原因。我认为这是不言自明的。 该命令不起作用,因为如果文件被删除,它将不会被./*捕获。 @JeanPaul 也许我理解错了,但它使我的工作区处于原始状态(现在已删除的文件存在)。 @Marc 它可以工作,但前提是目录中没有可见文件,否则./* 将被 bash 扩展以匹配这些文件,然后再发送到 git。【参考方案7】:

如果你用过

git rm filename

然后删除文件

git checkout path/to/filename

不起作用,所以在那种情况下

git checkout HEAD^ path/to/filename

应该工作

【讨论】:

我喜欢这个答案。毫无疑问,您影响了您删除的特定文件。 1) git checkout path/to/filename 2) git checkout -- path/to/filename 优秀。 git checkout HEAD^ path/to/filename 为我工作,因为我没有提交文件。 看准了!一个安全的选择。 如果您还没有提交文件,git checkout HEAD path/to/filename 可能就足够了。所以从最后一次结帐,而不是以前的提交。【参考方案8】:

使用git ls-files 签出已删除(-d) 或修改(-m) 的文件。

git checkout $(git ls-files -d)

见How can I restore only the modified files on a git checkout?

【讨论】:

比其他解决方案更好、更简单 如果有些文件有空间你可以git ls-files -d | xargs -I git checkout "".【参考方案9】:

你想看看this

这适用于您使用的情况

git checkout -- .

在你提交某事之前。

您可能还想删除尚未创建的已创建文件。而你不想要它们。与:

git reset -- .

【讨论】:

您没有完整报告您复制的答案。事实上git checkout -- . 并不能帮助恢复已删除的文件,相当于提问者尝试过的:git checkout .。可以工作的部分是你没有复制的部分:git checkout &lt;file_path&gt;.【参考方案10】:

1.找到您要恢复的特定提交:

   git log
This command will give you a list of commits done by you .

2.使用 :

恢复到该提交
    git revert <commit id> 

现在您的本地分支将特别拥有所有文件

【讨论】:

【参考方案11】:

我遇到了同样的问题,但上述解决方案均不适合我。 我最终做的是: - 创建一个同名的空文件 - 将此文件与其本地历史记录进行比较 - 将历史记录复制到空文件中。

【讨论】:

【参考方案12】:

对我来说有效的是git checkout SHA1 of commit with version to restore "path to file to restore"

例如git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(在我们希望文件进入的分支中执行)

该命令执行后,恢复的文件将存在于原始位置(需要提交)

【讨论】:

和/或只是一个git checkout master path/to/the/file.bin,这样您就可以取消删除该文件而不会丢失您可能已经完成的任何其他更改。 PS:这应该是公认的答案...【参考方案13】:

由于您正在执行git checkout .,因此您似乎正在尝试将分支恢复到上次提交状态。

您可以通过git reset HEAD --hard 实现此目的

警告

这样做可能会删除您的所有最新修改并取消暂存您的修改,例如,您可能会丢失工作。它可能是您想要的,但请查看the docs 以确保。

【讨论】:

哇!小心这个!!!!你可能是对的,但有人可能会感到困惑并炸毁他们的整个代码。如果您添加更大的警告会很酷。 这正是我所需要的。不会炸毁你的整个代码 - 只是让你回到最近的提交。 我最终一次丢失了数百个文件。这是解决问题的唯一实用方法。谢谢!【参考方案14】:

在寻找有关如何取消删除从另一个分支合并后在我的工作目录中删除的文件的答案时发现了这篇文章。合并后还没有提交。 由于这是一个正在进行的合并,我不能只使用以下方法将其添加回来:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

除了重置之外,我还必须执行另一个步骤才能恢复文件:

$ git checkout -- file.cpp

【讨论】:

【参考方案15】:

如果您正在寻找已删除的目录。

 git checkout ./pathToDir/*

【讨论】:

【参考方案16】:
git checkout HEAD -- client/src/pp_web/index.cljs

【讨论】:

【参考方案17】:

如果您尚未提交任何更改,您只需将这些更改存储起来,然后您将返回到最后一次工作提交。

git stash
git stash clear
git clean 

【讨论】:

把它放在存储堆栈上不是一个解决方案。这是一个黑客。 Thisc 是一个不错的解决方案,因为您可以将其从存储中删除。不管是不是黑客,这是品味问题。 stash 的整个想法是聪明的 hack。 @EinoMäkitalo 很高兴它对你有帮助:) 在所有列出的方法中,我最喜欢这种方法【参考方案18】:

如果您想一次恢复所有文件

记得使用句号,因为它告诉 git 抓取所有文件。

此命令将重置头部并取消暂存所有更改:

$ git reset HEAD . 

然后运行这个来恢复所有文件:

$ git checkout .

然后做一个 git status,你会得到:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

【讨论】:

这是最简单的解决方案,适用于一堆文件(假设您删除了多个文件/文件夹)。干得好伙计+【参考方案19】:

如果您已经安装了 ToroiseGIT,那么只需为父文件夹弹出菜单选择“Revert...”菜单项。

【讨论】:

【参考方案20】:

这是在我的 mac 上帮助我的命令。我尝试了一些其他解决方案,但它们对我不起作用。

OSX Mavericks 上的 Git 版本

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

命令

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

【讨论】:

【参考方案21】:

输出告诉你你需要做什么。 git reset HEAD cc.properties

这将取消 rm 操作。之后,再次运行git status 将告诉您需要执行git checkout -- cc.properties 才能取回文件。

更新: 我的配置文件中有这个

$ git config alias.unstage
reset HEAD

我通常用来取消舞台的东西。

【讨论】:

如何处理多个已删除的文件?多次运行 git reset HEAD > 会很麻烦,有什么有效的方法来完成它? git reset HEAD \* 然后git checkout -- . 但是我修改了文件。 rm -r ./engines - 哎呀。现在git reset engines; git checkout engines. @zyy -- 表示文件。例如如果您有一个名为foo 的分支。 git co foo 将结帐到分行。但是,git co -- foo 将检出名为 foo 的文件。【参考方案22】:

只要git checkout path/to/file-I-want-to-bring-back.txt

【讨论】:

仅在文件尚未提交和推送时有效。 对我不起作用,git 说它不知道该名称的任何文件,尽管该文件已被跟踪。我也没有提交,我只是错误地使用 netbeans 的上下文菜单删除了一个文件。 @Zelphir +1 error: pathspec 'file.ext' did not match any file(s) known to git. @user3479125 我猜你的文件从未提交过。 git status 对此有何评论? Git 状态显示绿色“delated file.ext”git checkout HEAD -- file.ext 帮助恢复。【参考方案23】:

您已经进行了删除,因此您需要执行以下操作:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . 仅从已暂存删除的索引中签出。

【讨论】:

以上是关于git restore 删除后未提交的已删除文件的主要内容,如果未能解决你的问题,请参考以下文章

Git在添加主存储库之前恢复主存储库后未删除子模块

git中误删提交(commit)后,怎么恢复

Git(删除文件)

git教程:删除文件

我可以恢复从未提交的已删除文件吗?

Git使用教程-7.删除文件