git恢复已删除的文件,删除后没有提交

时间:2012-08-14 16:27:38

标签: git

我删除了一些文件。

我还没有提交。

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

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

22 个答案:

答案 0 :(得分:707)

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

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

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

$ git config alias.unstage
reset HEAD

我通常用来取消它的东西。

答案 1 :(得分:185)

您已暂停删除,因此您需要执行以下操作:

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

git checkout .仅从已经删除了删除的索引中签出。

答案 2 :(得分:148)

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

答案 3 :(得分:120)

自动恢复所有非暂存删除,而不指定每个路径:

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

自动恢复所有暂存删除,而不指定每个路径:

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

答案 4 :(得分:71)

由于您正在执行git checkout .,看起来您正在尝试将分支恢复到上次提交状态。

您可以使用git reset HEAD --hard

来实现此目的

警告

执行此操作可能会删除所有最新修改并取消修改,例如,您可能会丢失工作。 可能是你想要的,但请查看the docs以确保。

答案 5 :(得分:47)

如果您使用

git rm filename

删除文件然后

git checkout path/to/filename

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

git checkout HEAD^ path/to/filename

应该有效

答案 6 :(得分:27)

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

答案 7 :(得分:17)

git checkout HEAD -- client/src/pp_web/index.cljs

答案 8 :(得分:15)

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

git checkout $(git ls-files -d)

请参阅How can I restore only the modified files on a git checkout?

答案 9 :(得分:15)

如果要一次恢复所有文件

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

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

$ git reset HEAD . 

然后运行此命令以恢复所有文件:

$ git checkout .

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

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

答案 10 :(得分:7)

您可以查看this

吗?

适用于您使用

的情况
git checkout -- .
在提交之前

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

git reset -- .

答案 11 :(得分:6)

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

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

除了重置之外我还要做另一步以恢复文件:

$ git checkout -- file.cpp

答案 12 :(得分:4)

如果您尚未提交任何更改,则只需隐藏这些更改,您将返回上一次工作提交。

git stash
git stash clear
git clean 

答案 13 :(得分:4)

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

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

$ 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"

答案 14 :(得分:3)

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

 git checkout ./pathToDir/*

答案 15 :(得分:2)

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

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

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

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

答案 16 :(得分:1)

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

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

beforeEach(angular.mock.module(function($provide) { 
    $provide.service('textService', function () {
        return {

          //Object for Licensing Module
          licensing: {
            pageTitle: "Page Title",
            controlLabels: {
              accountName: "Account Name",
              ticketNo: "Ticket No",
              hostId: "Host Id",
            }
          }
      };
    });
}));

答案 17 :(得分:1)

如果你已经安装了ToroiseGIT,那么只需选择&#34;还原......&#34;父文件夹弹出菜单的菜单项。

答案 18 :(得分:0)

较新的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”将其恢复,如前所述。没有更多搜索!

答案 19 :(得分:0)

对我有用的是

git reset HEAD app/views/data/landingpage.js.erb
git restore app/views/data/landingpage.js.erb

我要还原的文件是app/views/data/landingpage.js.erb

答案 20 :(得分:-1)

1.找到您想要使用的特定提交:

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

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

    git revert <commit id> 

现在,您的本地分支将具有特定的所有文件

答案 21 :(得分:-1)

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

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