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

Hom*_*man 752 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
#
Run Code Online (Sandbox Code Playgroud)

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

Nou*_*him 758

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

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

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

$ git config alias.unstage
reset HEAD
Run Code Online (Sandbox Code Playgroud)

我通常用它来取消东西.

  • `git reset HEAD\*`然后`git checkout - .` (62认同)
  • 你如何为多个删除的文件执行此操作?多次运行git reset HEAD << filename >>会很麻烦,任何有效的方法都可以完成它吗? (4认同)
  • 但我修改了文件. (3认同)
  • `rm -r ./engines` - 哎呀。现在`git重置引擎;git 结帐引擎`。 (2认同)
  • @zyy ‘--’ 表示文件。例如,如果您有一个名为“foo”的分支。`git co foo` 将签出到分支。但是,“git co -- foo”将签出名为“foo”的文件。 (2认同)

CB *_*ley 201

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

git checkout HEAD cc.properties store/README store/cc.properties
Run Code Online (Sandbox Code Playgroud)

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

  • `git checkout HEAD fileToDelete`可以解决问题. (108认同)

sed*_*nym 162

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

  • 没有为我工作,git表示它不知道该名称的任何文件,虽然该文件被跟踪.我也没有提交,我只是错误地使用netbeans的上下文菜单删除了一个文件. (18认同)
  • Git状态显示绿色"delated file.ext"`git checkout HEAD - file.ext`帮助恢复它. (11认同)
  • 仅在尚未提交和推送文件时才有效. (7认同)
  • @Zelphir +1`错误:pathspec'file.ext'与git已知的任何文件都不匹配。 (2认同)

Pao*_*loC 135

要一次性自动恢复所有未分级删除,而不指定每个单独路径:

git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --
Run Code Online (Sandbox Code Playgroud)

要一次性自动恢复所有暂存的删除,而不指定每个单独的路径:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
Run Code Online (Sandbox Code Playgroud)

  • 我不小心删除了超过500个文件,这是一种享受,因为它还保留了我所有的有效更改(第一行是我使用的).谢谢. (11认同)
  • 请注意,如果文件名/路径中有空格,则此方法无效.我想``git ls-files -d | sed -e"s/\(.*\)/'\ 1'/"| xargs git checkout - ``将起作用. (5认同)
  • 在此对我有用之前,我必须运行`git status --long | grep'已删除:'| awk'{print $ 2}'| xargs git reset HEAD - `. (2认同)

Pau*_*l T 76

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

你可以用一个来实现这个目标 git reset HEAD --hard

警告

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

  • Woww!小心这个!!!! 你可能是对的,但是有人可能会感到困惑并且炸毁他们的整个代码.如果添加更大的警告,那就太酷了. (38认同)
  • 这正是我所需要的.不会炸毁你的整个代码 - 只是让你回到最近的提交. (3认同)
  • 我最终得到了数百个丢失的文件.这是解决问题的唯一实用方法.谢谢! (2认同)

Aur*_*zeb 57

如果你用过

git rm filename
Run Code Online (Sandbox Code Playgroud)

然后删除一个文件

git checkout path/to/filename
Run Code Online (Sandbox Code Playgroud)

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

git checkout HEAD^ path/to/filename
Run Code Online (Sandbox Code Playgroud)

应该管用

  • 我喜欢这个答案。毫无疑问,您仅影响*您删除的特定文件。1)git checkout路径/到/文件名2)git checkout-路径/到/文件名 (2认同)
  • 出色的。`git checkout HEAD^ path/to/filename` 对我有用,因为我没有提交文件。 (2认同)

Chr*_*haw 28

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

OSX Mavericks上的Git版本

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)
Run Code Online (Sandbox Code Playgroud)

命令

git checkout HEAD -- path/to/file/file.cc
Run Code Online (Sandbox Code Playgroud)


Dus*_*etz 18

git checkout HEAD -- client/src/pp_web/index.cljs
Run Code Online (Sandbox Code Playgroud)


ric*_*usa 17

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

git checkout $(git ls-files -d)
Run Code Online (Sandbox Code Playgroud)

请参阅如何在git checkout上仅恢复已修改的文件?

  • 如果某些文件有空间,您可以执行`git ls-files -d | xargs -I{} git checkout "{}"`。 (2认同)

Cas*_*kes 16

如果要一次还原所有文件

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

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

$ git reset HEAD . 
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout .
Run Code Online (Sandbox Code Playgroud)

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

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单的解决方案,适用于一堆文件(假设您删除了多个文件/文件夹)。干得好伙计+ (2认同)

Muh*_*man 9

以下是不同的案例,作为帮助他人的参考:

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

$ git checkout -- <file>
Run Code Online (Sandbox Code Playgroud)

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

$ git ls-files --deleted
Run Code Online (Sandbox Code Playgroud)

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

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout <commit>^ -- <file>
Run Code Online (Sandbox Code Playgroud)

例子:

$ git checkout c46e81aa403ecb8a0f7a323a358068345^ -- <file> 
Run Code Online (Sandbox Code Playgroud)

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

$ git log --diff-filter=D --summary
Run Code Online (Sandbox Code Playgroud)

如果只想显示文件列表:

git log --diff-filter=D --summary | grep "delete mode"
Run Code Online (Sandbox Code Playgroud)


小智 8

你能想要看到这个吗?

适用于您使用过的情况

git checkout -- .
Run Code Online (Sandbox Code Playgroud)

在你做某事之前.

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

git reset -- .
Run Code Online (Sandbox Code Playgroud)


use*_*404 6

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

$ git reset <commitid#-where-file.cpp-existed> file.cpp
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout -- file.cpp
Run Code Online (Sandbox Code Playgroud)


Ric*_*ick 5

如果您还没有提交任何更改,您所要做的就是隐藏这些更改,然后您将返回到上次工作提交。

git stash
git stash clear
git clean 
Run Code Online (Sandbox Code Playgroud)

  • Thisc 是不错的解决方案,因为您可以将其从 stash 中删除。如果是黑客与否,这是品味问题。stash 的整个想法是聪明的黑客。 (2认同)
  • 在列出的所有方法中,我最喜欢这种方法 (2认同)

use*_*745 5

这对我来说是最简单的方法:

git checkout HEAD~1 path/to/myfile.rb
Run Code Online (Sandbox Code Playgroud)

在这里找到的。


另一种方法也对我有用:

git reset HEAD path/to/myfile.rb
git restore path/to/myfile.rb
Run Code Online (Sandbox Code Playgroud)