从git reset恢复 - 硬盘?

Jac*_*les 411 git

有没有办法从工作目录恢复未提交的更改git reset --hard HEAD

seh*_*ehe 421

一般情况下,您无法取回未提交的更改.

以前分阶段的更改(git add)应该可以从索引对象中恢复,因此如果您这样做,则用于git fsck --lost-found查找与其相关的对象.

如果没有,这里的答案是:看看你的备份.也许您的编辑器/ IDE将临时副本存储在/ tmp或C:\ TEMP之类的东西中.[1]

git reset HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

这将恢复到之前的HEAD

[1] vim例如可选地存储持久性撤销,eclipse IDE存储本地历史 ; 这样的功能可能会节省你的**

  • Eclipse的本地历史 - 此外,由于一些更改超过6天,我的Time Machine备份Eclipse的本地历史记录!由于某种原因,由git管理的文件夹的Time Machine备份不包含我以前的更改. (17认同)
  • 谢谢你用`git reset HEAD @ {1}`来保存我的生活 (16认同)
  • 确实,Eclipse 中的本地历史(在我的情况下为 Intellij)节省了我恢复意外更改的时间,这里为 Intellij 提供文档:https://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-删除文件/ (8认同)
  • IDE(IntelliJ)在本地存储了更改,从而节省了当天的时间.谢谢你的提示! (4认同)
  • `git reset HEAD@{1}` 在 powershell 终端中导致错误,导致 `error:known switch ``e'` 解决这个问题的方法是用单引号转义大括号,如下所示:`git reset 'HEAD@{1} '` 因为花括号对于 powershell 有不同的含义 (4认同)
  • 哇这太神奇了。即使您从未提交过,它也能工作。 (3认同)
  • 在暗示中你是一个严肃的生命保护者!TextWrangler有一个文件备份.谢谢 (2认同)
  • 用于检查已添加到暂存区域但从未提交的任何文件的 Shell 代码段: `for fname in $(ls .git/lost-found/other/); 执行 echo $fname:; 猫 .git/lost-found/other/$fname; 读-n 1 -p“继续?”;回声; 完成` (2认同)
  • 对于 VSCode,资源管理器中有一个“时间轴”选项卡,您可以在其中查看文件的先前版本,希望它会对某人有所帮助 (2认同)

ken*_*ken 413

从这个回答SO

$ 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}
Run Code Online (Sandbox Code Playgroud)

你有一天回来了!:)

  • 只是为了补充这个答案,这将有助于那些实际提交了通过硬重置而被丢弃的更改的人. (17认同)
  • 很棒 - 但在我的情况下,文件完全消失了.使用`git checkout HEAD @ {19}`允许我检查处于分离状态的丢失文件.然后使用`git checkout -b new-branch-name`将它们添加回处于"附加"状态的仓库. (8认同)
  • 几年后,你拯救了我的一天xx (7认同)
  • 这个答案似乎不正确。OP 询问是否可以恢复“未提交”的更改。这只会恢复孤立的“已提交”更改。 (7认同)
  • ken 和@NightOwl888 你们刚刚救了我三天的命!祝您幸福、繁荣! (5认同)
  • @ user3385759 - 在Git中,当你对任何不是分支的东西使用checkout命令时,它将进入一个特殊的"分离头"模式.这意味着您实际上并未指向分支,但您可以查看在实体状态下检入的内容(在本例中为reflog条目).从该状态,您可以将其转换为"真正的"分支,您可以使用`git checkout -b new-branch-name`再次返回.本书[使用Git实用版本控制](https://pragprog.com/book/tsgit/pragmatic-version-control-using-git)很好地用简单的术语解释了Git. (3认同)
  • 是的,NomNomCameron和Jesse Adelman说了什么。我错误地认为重置将重置为我的最后一次提交。不。它消灭了一切。这个答案使我免于一两天的重新创作工作。 (2认同)

Jus*_*tin 297

git reset --hard今天我也不小心跑了我的回购,而今天也有未提交的更改.为了得到它,我跑了git fsck --lost-found,写了所有未引用的blob <path to repo>/.git/lost-found/.由于文件是未提交的,我在其中的other目录中找到了它们<path to repo>/.git/lost-found/.从那里,我可以看到未提交的文件,复制blob,并重命名它们.

注意:仅当您将要保存的文件添加到索引(使用git show <filename>)时,此选项才有效.如果文件不在索引中,则会丢失.

  • 只是为了节省任何时间`#!/ bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES =*COUNTER = 0 for f in $ FILES do echo"Processing $ f file ..."git show $ f> "PATH_TO_RECOVERY_DIRECTORY/$ COUNTER.m"让COUNTER = COUNTER + 1完成 (5认同)
  • 我在`lost-found`中只获得了提交引用的文件.但我可以做`git show`来获取内容. (4认同)

Ga *_*chi 160

是的,您可以通过 git中的硬重置来恢复.

使用:

git reflog
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard <commit-retrieved-using-reflog>
Run Code Online (Sandbox Code Playgroud)

这招几次挽救了我的生命.

你可以在这里找到reflog的文档.

  • 到目前为止,我认为这是最好,最简洁的答案.使用另一个`git reset --hard`从`git reset --hard`恢复可能看起来很直观,但是如果你不使用`--hard`开关,你将在你的工作区中留下条目会有效地恢复刚恢复的工作. (9认同)
  • 这个答案是不正确的。此方法仅恢复先前 ** 提交的** 更改。它将无法恢复 ** 未提交的** 更改(这就是这个问题的内容)。 (4认同)
  • 奇迹般有效!先前的答案(/sf/ask/405162621/#24236065)对我不起作用。 (2认同)
  • 这个解决方案对我有用。我进行了硬重置,然后当我使用“git log”时,我没有看到提交的 id。使用 `git reflog` 我可以看到提交 ID (2认同)
  • 你帮我节省了一天的工作量。我不知道该如何感谢你。:) (2认同)

Orc*_*cun 58

当我在开发本地项目时,我想将它移动到GitHub,然后创建一个新的存储库.当我尝试使用.gitignore将所有这些文件添加到新存储库时,我意外添加了错误的文件然后尝试清除它.

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

然后删除了所有本地文件,因为repo为空.我以为一切都没了.

这救了我的命

git reflog show
git reset HEAD@{1} 
git push 
Run Code Online (Sandbox Code Playgroud)

希望它拯救另一种生命.


Jon*_*ien 34

如果你使用像IntelliJ这样的东西:

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

项目或文件夹的本地历史记录视图显示您在过去几天中所做的所有事情.在对话框下半部分的"操作"列中,选择要回滚的操作.[...]这样做,对话框的上半部分显示已更改文件的树视图.如果只想恢复已删除的文件,则无论此后所做的其他更改如何,都可以在树视图中选择文件Lost.txt,然后单击"还原"按钮.

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

这让我的屁股出了火!

  • 这是迄今为止对 IntelliJ 用户的最佳答案!非常感谢,这很完美。我尝试了所有其他解决方案,但没有一个效果很好。`git reflog` 不起作用,因为我没有提交更改。`git fsck --lost-found` 适用于暂存文件,但并非所有文件都已暂存。IntelliJ 的本地历史记录完美恢复了我未保存的文件,我非常感谢这个功能 (3认同)
  • 拯救了我的一天! (2认同)
  • 这在 PyCharm 中拯救了我。JetBrains 万岁! (2认同)

小智 29

我刚刚做了git reset --hard,失去了所有未提交的更改.幸运的是,我使用编辑器(IntelliJ),我能够从本地历史中恢复更改.Eclipse应该允许你这样做.

  • 这是一个救星,我以为工作时间就这样浪费了。 (2认同)
  • 同样的事情也适用于我的 Visual Studio Code。事实证明,时间轴功能在这种情况下确实很有帮助。 (2认同)

Mat*_*Moy 16

根据定义,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,它会回报一天.


Luc*_*che 14

IntelliJ 有一个可通过history 命令访问的临时文件夹:

  1. 在导航窗格中选择要从中恢复文件的文件夹
  2. 双击 Shift 键(Shift-Shift)
  3. 在弹出的输入框中输入Local History并按Enter键
  4. 选择显示历史记录
  5. 现在您可以恢复到您需要的版本。


Edw*_*kwu 11

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

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case
Run Code Online (Sandbox Code Playgroud)

假设HEAD@{2}是您想要回到的状态


Dra*_*ght 10

如果我失去一些变化,这就是我通常会做的事情.

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 ...
Run Code Online (Sandbox Code Playgroud)

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


mk.*_*k.. 8

信息丢失了.

由于您没有提交,您的.git从未存储过此信息.所以,基本上git无法为你恢复.

但是,如果你刚刚做了git diff,有一种方法可以使用终端输出恢复,具有以下3个简单步骤.

  1. 滚动你的终端并寻找o/p git diff.将o/p保存在名为diff.patch的文件中
  2. 使用制表符(\ t)字符搜索并替换所有7个空格和8个空格并保存更改.
  3. 进入你的git存储库.应用diff.patch(patch -p1 < diff.patch)

你得救了!:)

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


Ga *_*chi 6

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


小智 6

你可以在做完之后回来提交reset --hard HEAD.

利用" git reflog"来检查HEAD分支的历史.

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

做一个

git reset {commit Id of the commit you want to bring back}
Run Code Online (Sandbox Code Playgroud)


Rus*_*ust 6

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

git reflog show
# head to recover to
git reset HEAD@{1} 
Run Code Online (Sandbox Code Playgroud)

并且由于某种原因正在得到:

错误:未知开关“e”

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

git reset 'HEAD@{1}'
Run Code Online (Sandbox Code Playgroud)


Moh*_*mad 6

 git reset HEAD@{4}
Run Code Online (Sandbox Code Playgroud)

4 是 4 步之前的变化。如果您选择了正确的步骤,它应该显示您从硬盘中删除的文件列表。然后做:

$ git reflog show
Run Code Online (Sandbox Code Playgroud)

它会向你展示我们已经创建的本地提交历史。现在做:

$ git reset --hard 8c4d112
Run Code Online (Sandbox Code Playgroud)

8c4d112 是一个代码,你想在那里重置你的硬盘。让我们看看 https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history以获取更多信息。


Sly*_*tor 5

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

  fatal: refusing to merge unrelated histories
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助