git恢复删除的文件,删除后未提交任何内容


812

我删除了一些文件。

我还没有承诺。

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

我做了一个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


16
如果您在删除后还没有上演更改,git checkout .那就可以了。
faizal

10
@faizal,否则您将丢失所做的更改。
Vasiliy Yorkin 2015年

1
只需在git gui中的已删除项目上按Ctrl-J。
ajeh

git checkout-cc.properties存储/自述文件存储/cc.properties
Vinod Pasi

看到这个答案:quora.com/...
活的爱情

Answers:


787

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

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

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

$ git config alias.unstage
reset HEAD

我通常用它来撤消工作。


5
您如何针对多个已删除的文件执行此操作?多次运行git reset HEAD << filename >>会很麻烦,有什么有效的方法可以完成它吗?
SubSul

70
git reset HEAD \*然后git checkout -- .
努法尔·易卜拉欣

3
但是我已经修改了文件。
姜YD

@RauliRajande您的情况可能与原始问题中描述的情况有所不同。
努法尔·易卜拉欣

1
rm -r ./engines-哎呀 现在git reset engines; git checkout engines
克里斯(Kris)'18

209

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

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

git checkout . 仅从已进行删除的索引中检出。


177

做就是了 git checkout path/to/file-I-want-to-bring-back.txt


8
仅在文件尚未提交和推送时有效。
mahen3d 2015年

23
不适用于我,git表示虽然该文件已被跟踪,但它不知道该名称的任何文件。我也没有提交,我只是错误地使用了netbeans的上下文菜单删除了一个文件。
Zelphir Kaltstahl 2015年

4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov '16

@ user3479125我猜您的文件从未提交过。怎么git status说呢?
ki92

12
Git状态显示绿色“ delated file.ext” git checkout HEAD -- file.ext有助于还原它。
伊万·博什乔夫

143

要一次自动恢复所有未暂存的删除操作,而无需指定每个路径,请执行以下操作:

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

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

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

12
我不小心删除了500多个文件,这很有效,因为它还保留了我所有的有效更改(第一行是我使用的内容)。谢谢。
Guy Lowe

1
成功构建后,不小心删除了回购的所有内容。第一条命令保存了我的培根。
MonaLisaOverdrive

2
在这对我有用之前,我不得不跑步git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --
伊恩·邓恩

1
非常有用,想保留未跟踪的文件,但要删除和修改文件,只需将-d更改为-m即可处理修改过的文件。
RaisinBranCrunch

5
请注意,如果文件名/路径中有空格,则此方法无效。我认为git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --会起作用。
parsley72

79

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

您可以使用 git reset HEAD --hard

警告

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


39
哇!小心这一点!!!!您可能是正确的,但是可能会感到困惑并炸毁了他们的整个代码。如果您添加更大的警告,那将会很酷。
santiagobasulto

3
这正是我所需要的。不会破坏您的整个代码-只需将您带回到最近的提交即可。
安德鲁·亨德里

2
我最终一次丢失了数百个文件。这是解决问题的唯一实用方法。谢谢!
乔纳森·本

66

如果你用过

git rm filename

然后删除文件

git checkout path/to/filename

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

git checkout HEAD^ path/to/filename

应该管用


2
我喜欢这个答案。毫无疑问,你是影响只有你删除特定文件。1)git checkout路径/至/文件名2)git checkout-路径/至/文件名
山的Ed

优秀的。git checkout HEAD^ path/to/filename因为我没有提交文件,所以为我工作。
摩西·内迪达

29

这是在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



17

如果要一次还原所有文件

记住要使用句点,因为它告诉git抓取所有文件。

此命令将重置磁头,并撤消所有更改:

$ git reset HEAD . 

然后运行此命令以还原所有文件:

$ git checkout .

然后执行git status,您将获得:

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

这是最简单的解决方案,适用于一堆文件(假设您删除了多个文件/文件夹)。
好家伙

9

你能看到这个

这适用于您使用的情况

git checkout -- .

在您提交某件事之前。

您可能还希望摆脱尚未创建的文件。而且您不想要它们。与:

git reset -- .

您没有完全报告您复制的答案。实际上git checkout -- .,这无助于恢复已删除的文件,它等同于要求者尝试的操作:git checkout .。可以工作的部分是您未复制的部分:git checkout <file_path>
Jean Paul

6

在寻找有关如何从另一个人的分支合并后如何删除在我的工作目录中删除的文件的答案时,找到了这篇文章。合并后尚未进行任何提交。由于这是正在进行的合并,因此我不能仅使用以下方法将其添加回:

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

除了重设以外,我还必须执行另一步骤才能将文件重新带回:

$ git checkout -- file.cpp

4

如果您尚未提交任何更改,那么您所要做的就是隐藏这些更改,您将返回到上一个有效的提交。

git stash
git stash clear
git clean 

将其放在存储堆栈上不是解决方案。这是一个hack。
罗伯特·多尔卡

2
这是一个很好的解决方案,因为您可以将其从存储中删除。不管是不是骇客,这都取决于品味。藏匿的整个想法是聪明的黑客。
EinoMäkitalo16年

@EinoMäkitalo很高兴能为您提供帮助:)
Rick

在列出的所有方法中,我最喜欢这种方法
ckapilla

3

如果要查找已删除的目录。

 git checkout ./pathToDir/*

3

以下是帮助他人的参考案例:

如果尚未提交删除,则以下命令将在工作树中恢复已删除的文件。

$ 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,现在在这里使用commit#

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

像这样的东西:$ git checkout c46e81aa403ecb8a0f7a323a358068345-

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

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

如果只想显示文件列表:

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

2

对我来说有效的是 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:这应该是公认的答案...
Edoardo

1

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


1

1.使用以下命令找到要还原到的特定提交:

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

2.使用以下命令恢复到该提交:

    git revert <commit id> 

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


如果您已经提交了更改,则此方法有效。
现场直播

1

注意:首先进行您想保留的任何工作。

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

git checkout ./*

2
仅供参考...此命令删除了我所有的工作文件,但未恢复已删除的文件..当心
hendr1x

这就是为什么您使用此命令来重置工作空间的原因。我认为这是不言而喻的。
HenriqueFlorêncio18年

1
该命令不起作用,因为如果删除了文件,它将不会被捕获./*
让·保罗

@JeanPaul也许我误会了,但是它使我的工作空间处于原始状态(现在已删除文件)。
马克

@Marc它可以工作,但是仅当目录中没有可见文件时才起作用,因为否则./*,在发送给git之前,bash将对其进行扩展以匹配这些文件。
让·保罗

0

我遇到了同样的问题,但是上述解决方案都对我无效。我最后要做的是:
-创建一个具有相同名称的空文件
-将此文件与其本地历史记录进行比较
-将历史记录复制到空文件中。


-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.