【问题标题】:Restore deleted file not staged in git恢复未在 git 中暂存的已删除文件
【发布时间】:2014-09-14 17:10:34
【问题描述】:

我不小心删除了我的源代码的整个目录...使用了一个不错的 rm -r。我知道,真的很糟糕;但幸运的是,我在包含目录中有一个 git repo。因此,git 有大量已删除文件的 unstaged 更改列表。例如:

"deleted:   src/caronmonitor/server.py" 

如何取回这些文件?网上有很多建议:

git checkout file

git revert <commit>

但据我了解,这会将文件恢复到上次提交时的状态。我不想回到最后一次提交,而是回到删除操作之前。我可以查看 gitk 并查看删除前的文件;因此这必须是可能的。

【问题讨论】:

  • 您在删除文件之前是否已暂存该文件?否则 git diff 只会显示最后一次提交的状态
  • 他们没有上演。我搞砸了,我的意思是gitk。那么 gitk 中“本地未提交的更改,未签入索引”下的内容是上次提交时的内容?

标签: git git-checkout rm git-revert git-rm


【解决方案1】:

是的,你应该做一个git checkout filename

如果您有多个文件,并且想要恢复所有文件,请使用 git 目录根目录下的git checkout .

结帐会将文件恢复到上次添加/提交的版本;如果一个文件还没有被添加或提交,那么它将丢失。

所以,例如:

$ git init && touch test1.txt test2.txt test3.txt
$ git add test1.txt && git commit -m "test1" && git add test2.txt
$ ls -a
.  .. .git test1.txt  test2.txt test3.txt

#deleting files below, 2 will be recovered, 3rd will be gone.
$ rm *
$ ls -a
.  .. .git

$ git checkout .
$ ls -a
.  .. .git test1.txt  test2.txt
#test3.txt is gone, test2.txt was recovered, even though not committed but just added

【讨论】:

    【解决方案2】:

    不是,GIT 没有任何魔法。如果您没有暂存或提交您的更改,那么这些就消失了。 您可以看到删除,但您只能将这些恢复到您告诉 GIT 为您记住它的最后状态。

    您必须通过暂存和提交明确告诉 GIT 记住您的更改。

    因此,如果您的存储库中有 file.txt 的内容:

        int main(argc[] args){
          System.out.println("example");
        }
    

    这是您最后一次提交或暂存的更改。

    现在您编辑 file.txt 以包含以下内容:

    int main(argc[] args){
     System.out.println("example");
     System.out.println("Hey I can print more lines");
    }
    

    你保存你的文件,关闭编辑器,用 git 什么都不做,然后做rm -r 现在文件在那里,git 引用了文件并且它被删除了,但是这个文件在 git 中的内容只有:

        int main(argc[] args){
          System.out.println("example");
        }
    

    【讨论】:

    • 我知道 git 没有任何魔法;但似乎在 gitk 中,git 在删除之前有一份文件副本。我还意外地从 git repo 中删除了一个文件,并且能够恢复它,至少,我认为我做到了。
    • @Vance-Turner 我添加了一些小例子来说明我如何看待这一点。
    【解决方案3】:

    git 不会存储任何从未添加或提交的更改。您可以做的最好的事情是 git checkout 删除的目录,然后您将把它恢复到上次提交时的状态。

    git checkout &lt;branch_you_are_in&gt; &lt;directory_of_all_your_source_code&gt;

    你看到的本地未提交的更改可能是未提交的删除,即git看到你已经删除了一堆文件,但你还没有提交它们被删除的事实,所以git说'嘿,那里是您尚未提交的一些更改(在本例中为删除)。'

    【讨论】:

      【解决方案4】:

      类似的事情发生在我身上。我使用过 Android Studio,但它也可以在其他 JetBrains IDE 中使用。

      我已经通过Local history &gt; show history恢复了我删除的文件,然后我恢复了所有删除的文件。

      希望它对某人有所帮助。

      【讨论】:

        【解决方案5】:

        我已经在 Eclipse IDE 中打开了该文件,因此为了恢复我通过执行 git checkout 意外丢失的更改,我在 Eclipse IDE 中按照以下建议进行了操作。

        https://www.oreilly.com/library/view/eclipse-cookbook/0596007108/ch04s08.html 4.7.从本地历史中恢复元素和文件

        您还可以通过在包资源管理器等视图中右键单击该文件并选择以下菜单项之一,将整个文件恢复到以前的版本:

        替换为→ 本地历史中的上一个

        Replaces the file with the previous version in local history
        

        替换为→ 本地历史记录

        Replaces the file with a version you select from local history
        

        从本地历史恢复

        Restores a file from local history
        

        【讨论】:

          猜你喜欢
          • 2017-05-10
          • 2020-07-09
          • 2015-09-01
          • 2012-03-24
          • 2022-06-17
          • 1970-01-01
          • 2020-09-11
          • 2011-05-14
          相关资源
          最近更新 更多