繁体   English   中英

git 恢复删除后未提交的已删除文件

[英]git recover deleted file where no commit was made after the delete

我删除了一些文件。

我还没有承诺。

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

我做了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 reset HEAD cc.properties等。

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

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

$ git config alias.unstage
reset HEAD

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

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

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

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

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

要一次自动恢复所有未暂存的删除,而无需指定每个路径:

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

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

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

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

您可以使用git reset HEAD --hard来实现这一点

警告

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

如果你用过

git rm filename

然后删除文件

git checkout path/to/filename

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

git checkout HEAD^ path/to/filename

应该管用

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

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

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

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

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

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

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

$ git reset HEAD . 

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

$ git checkout .

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

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
git checkout HEAD -- client/src/pp_web/index.cljs

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

git checkout $(git ls-files -d)

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

你想看看这个

这适用于您使用的情况

git checkout -- .

在你提交某事之前。

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

git reset -- .

如果您还没有提交任何更改,您所要做的就是存储这些更改,您将返回到最后一个工作提交。

git stash
git stash clear
git clean 

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

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

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

$ git checkout -- file.cpp

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

git checkout HEAD~1 path/to/myfile.rb

我在这里找到了。


另一种对我也有用的方法:

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

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

 git checkout ./pathToDir/*

较新的 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”将其取回,因为它是saz。 不用再找了!

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

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

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

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

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

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

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

    git revert <commit id> 

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

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

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

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

git checkout ./*

我碰巧将一些 json 文件从一个文件夹移动(而不是复制)到同一个存储库中的另一个文件夹。 然后我重命名了这些文件并在新位置更改了一些内容。 但是我很快了解到我没有从以前的位置复制并完全删除文件。

简单的解决方案:

git reset HEAD <oldfilepath_which_was_moved>
git restore <oldfilepath_which_was_moved>

对所有文件都这样做了,它们又回来了。

您还可以包含多个以空格分隔的文件。

git reset HEAD file_1_path file_2_path file_3_path

轻松修复,顺便说一句,这不会更改/删除新文件。

对于在运行git checkout时获得未知修订版或路径不在工作树中的任何人

运行git reset fileToRestore

然后git checkout fileToRestore

您的文件将被恢复

您可以使用git-restore将文件恢复到一个 go。

如果您没有像这样提交删除:

➜  learning git:(daily) ✗ git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    deleted:    feelings/articles/2022/1/assets/20220109_093659_image.png
    deleted:    feelings/articles/2022/1/assets/20220109_094525_image.png
    deleted:    feelings/articles/2022/1/assets/20220109_100231_image.png
    deleted:    feelings/articles/2022/1/assets/20220109_100251_image.png
    deleted:    feelings/articles/2022/1/assets/20220109_100321_image.png
    deleted:    feelings/articles/2022/1/assets/20220109_101009_image.png

你可以使用这样的东西来恢复你的文件:

git restore --worktree --staged feelings/articles/2022/1/assets

-W, --worktree, -S, --staged
指定还原位置。 如果未指定任何选项,默认情况下将恢复工作树。 指定 --staged 只会恢复索引。 指定两者将恢复两者。

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

情况:一个人删除了一个文件但没有提交

如果一个人删除了一个文件,然后立即意识到这是一个错误? 这很简单,只需执行以下操作:

git checkout HEAD <filename>

如果它是一个文件夹,只需执行以下操作:

git checkout HEAD <foldername>/

参考:https ://www.git-tower.com/learn/git/faq/restoreing-deleted-files

一种没有任何风险的解决方案是转到您的存储库页面(在 github 等上)并手动下载已删除的文件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM