从git reset –hard恢复?


Recover from git reset --hard?

有什么方法可以从git reset --hard HEAD恢复未提交的对工作目录的更改?


通常,您无法取回未提交的更改。

以前已分阶段进行的更改(git add)应该可以从索引对象中恢复,因此,如果这样做了,请使用git fsck --lost-found来查找与其相关的对象。 (这会将对象写入.git/lost-found/目录;从那里可以使用git show 查看每个文件的内容。)

如果没有,这里的答案将是:查看您的备份。也许您的编辑器/ IDE将临时副本存储在/ tmp或C: TEMP下,诸如此类。[1]

1
git reset HEAD@{1}

这将还原到先前的HEAD

[1] vim例如(可选)存储持久撤消,Eclipse IDE存储本地历史记录;这样的功能可能会节省您的**


从这样的答案

1
2
3
4
5
6
7
8
9
10
11
12
$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

您的一天回来了! :)


我今天也意外地在仓库上运行了git reset --hard,而今天也进行了未提交的更改。为了找回它,我运行了git fsck --lost-found,它将所有未引用的Blob写入了/.git/lost-found/。由于文件尚未提交,因此我在/.git/lost-found/other目录中找到了它们。从那里,我可以使用git show 看到未提交的文件,复制出blob,然后重命名它们。

注意:仅当您将要保存的文件添加到索引(使用git add .)时,此方法才有效。如果文件不在索引中,则它们将丢失。


是的,您可以从git的硬重置中恢复。

采用:

1
git reflog

获取提交的标识符。
然后使用:

1
git reset --hard <commit-retrieved-using-reflog>

这个把戏挽救了我一生。

您可以在此处找到reflog的文档。


在进行本地项目时,我想将其移至GitHub,然后创建一个新的存储库。当我尝试使用.gitignore将所有这些文件添加到新存储库时,我不小心添加了错误的文件,然后尝试清除它。

我跑了git reset --hard origin/master:P

然后,我的所有本地文件都删除了,因为该存储库为空。我以为一切都消失了。

这救了我一命:

1
2
3
git reflog show
git reset HEAD@{1}
git push

希望它能挽救另一条生命。


如果您使用类似IntelliJ的工具:

在上下文菜单上,选择"本地历史记录",然后在子菜单上单击"显示历史记录":

The local history view for a project or folder shows you everything
that you have done during the last few days. In the Action column of
the lower part of the dialog box, select the action you want to roll
back. [...] So doing, the upper part of the dialog box shows the tree view of changed files. If you want to restore the deleted file only, regardless of the other changes that have been done since then, you can select the file Lost.txt in the tree view and click the Revert button.

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

这只是让我的屁股火了!


我只是做了git reset --hard而丢失了所有未提交的更改。幸运的是,我使用了编辑器(IntelliJ),并且能够从本地历史记录中恢复更改。 Eclipse应该允许您执行相同的操作。


根据定义,git reset --hard会丢弃未提交的更改,而Git无法恢复它们(您的备份系统可能会有所帮助,但Git不会)。

实际上,很少有git reset --hard是个好主意。在大多数情况下,有一个更安全的命令可以执行相同的操作:

  • 如果要放弃未提交的更改,请使用git stash。它将保留这些更改的备份,如果您运行git gc,这些更改将在一段时间后过期。如果您确定99.9%的人将永远不需要这些更改,那么git stash仍然是您0.1%案例的朋友。如果您100%确信,则git stash仍然是您的朋友,因为这100%都有测量错误;-)。

  • 如果要在历史记录中移动HEAD和当前分支的尖端,则git reset --keep是您的朋友。它将执行与git reset --hard相同的操作,但不会放弃本地更改。

  • 如果您想两者都做,那么git stash && git reset --keep是您的朋友。

教您的手指不要使用git reset --hard,它将一天归还。


如果丢失一些更改,这通常是我要做的。

1
2
3
4
5
git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

将指针移回先前的提交,但将到目前为止所做的更改保留在最新的提交结帐git reset --soft dadada


如果您不小心硬重置了提交,请执行此操作,

1
2
git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

假设HEAD@{2}是您希望返回的状态


信息丢失。

由于您未提交,因此您的.git从未存储此信息。因此,基本上git无法为您恢复它。

但是,如果您只是执行git diff,则可以通过以下3个简单步骤使用终端输出进行恢复。

  • 滚动终端并查找git diff的o / p。将o / p保存在名为diff.patch的文件中
  • 搜索并用制表符( t)替换所有7个空格和8个空格,然后保存更改。
  • 进入您的git仓库。应用diff.patch(patch -p1 < diff.patch)
  • 您已保存! :)

    注意:将数据从终端复制到文件时,请小心并清楚地看到数据是连续输出的,并且不包含任何冗余数据(由于按下了向上和向下箭头)。否则您可能会搞砸。


    您可以在执行reset --hard HEAD之后取回提交。

    使用" git reflog"检查分支中HEAD的历史记录。

    您将在此处看到您的提交及其ID。

    做一个

    1
    git reset {commit Id of the commit you want to bring back}

    我遇到了同样的问题,我快要疯了....最初我提交了这个项目并合并了..
    稍后当我尝试运行git push --set-upstream origin master时,出现此错误

    1
      fatal: refusing to merge unrelated histories

    所以我运行了git reset --hard HEAD,它删除了一个3周的项目,但是下面的这几个命令节省了一天:

    1
    2
    3
    4
    git reset HEAD@{1}         //this command unstage changes after reset
    git fsck --lost-found      //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
    git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
    git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b

    希望这可以帮助


    如果您幸运地在另一个编辑器上打开了相同的文件(例如Sublime Text),请在这些文件上尝试使用ctrl-z。它救了我..


    我发现从git历史记录中删除git reset --hard 之前所有未提交的文件的困难方式。但是,我很幸运能够在拔出头发的整个过程中保持我的代码编辑器会话处于打开状态,结果发现每个受影响的文件中都有一个简单的control + z将文件状态恢复为版本在Git如此强迫地重设所有内容之前,我并没有要求它专门设置。 Hooray!!


    如果您尝试使用以下代码:

    1
    2
    3
    git reflog show
    # head to recover to
    git reset HEAD@{1}

    由于某种原因而变得:

    error: unknown switch `e'

    然后尝试将HEAD@{1}用引号引起来

    1
    git reset 'HEAD@{1}'

    正确答案。好,现在我喜欢git。 :-)这是一个简单的食谱。

    1
    2
    git log HEAD@{2}
    git reset --hard  HEAD@{2}

    其中" 2"是您提交所做更改的位置的数量。就我而言,被同事和老板打扰以帮助调试某些构建问题;因此,进行了两次硬重设;因此,HEAD和HEAD @ {1}被覆盖。 ew,会失去我们的辛勤工作。


    这样的参考答案,

    运行git reflog show之后,说您要提交9300f9d

    运行git reset 9300f9d之后

    您可以执行git status,然后可能需要检出文件以恢复更改

    git checkout-文件路径/名称


    如果您正在使用Netbeans进行开发,请在文件选项卡和文件编辑区域之间查看。有一个"来源"和"历史记录"。在"历史记录"上,您会看到使用版本控制(git / other)进行的更改,以及本地进行的更改。在这种情况下,本地更改可以节省您的时间。


    当我们执行git reset --hard时,所有本地未提交的更改都将被删除。要恢复更改-在IDE中单击文件,将文件与"本地历史记录"进行比较,"本地历史记录"将按日期列出更改,我们可以恢复数据。您的一天已保存!