通过“git reset—hard”从丢失未提交的更改中恢复;

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

356857 次浏览

不能通常会得到未提交的更改。

以前的分段更改(git add)应该可以从索引对象中恢复,所以如果可以,请使用git fsck --lost-found来定位与它相关的对象。(这将对象写到.git/lost-found/目录;在那里你可以使用git show <filename>来查看每个文件的内容。)

如果没有,答案是:看看你的备份。/tmp下的也许您的编辑器/IDE存储临时副本或C:\TEMP之类的。[1]

git reset HEAD@{1}

这将恢复到前一个HEAD

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

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

注意:只有当你将想要保存的文件添加到索引(使用git add .)时,这才有效。如果文件不在索引中,就会丢失。

我只是做了git reset --hard,丢失了所有未提交的更改。幸运的是,我使用了一个编辑器(IntelliJ),我能够从本地历史记录中恢复更改。Eclipse应该允许您做同样的事情。

答案来自所以

$ git reflog show


4b6cf8e (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to origin/master
295f07d HEAD@{1}: pull: Merge made by the 'recursive' strategy.
7c49ec7 HEAD@{2}: commit: restore dependencies to the User model
fa57f59 HEAD@{3}: commit: restore dependencies to the Profile model
3431936 HEAD@{4}: commit (amend): restore admin
033f5c0 HEAD@{5}: commit: restore admin
ecd2c1d HEAD@{6}: commit: re-enable settings app


# assuming you want to get back to 7c49ec7 (restore dependencies to the User model)


$ git reset HEAD@{2}

你的好日子回来了!:)

信息丢失了。

由于您没有提交,您的.git从未存储此信息。因此,基本上git不能为你恢复它。

但是,如果您刚刚执行了git diff,有一种方法可以通过以下3个简单步骤使用终端输出进行恢复。

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

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

如果你使用IntelliJ:

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

项目或文件夹的本地历史视图会显示所有内容 你在过去几天所做的一切。的操作列中 在对话框的下半部分,选择要滚动的动作 回来。[…这样做,对话框的上部显示了更改文件的树状视图。如果您只想恢复已删除的文件,而不考虑从那时起所做的其他更改,您可以在树视图中选择文件Lost.txt,并单击Revert按钮

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

这把我救了出来!

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

实际上,在极少数情况下,git reset --hard是个好主意。在大多数情况下,有一个更安全的命令来做同样的事情:

  • 如果想要丢弃未提交的更改,请使用git stash。它将保留这些更改的备份,如果您运行git gc,该备份将在一段时间后过期。如果您99.9%确定永远不需要这些更改,那么对于0.1%的情况,git stash仍然是您的朋友。如果你100%确定,那么git stash仍然是你的朋友,因为这些100%有测量误差;-)。

  • 如果你想移动你的HEAD和历史中当前分支的尖端,那么git reset --keep是你的朋友。它将做与git reset --hard相同的事情,但将而不是丢弃您的本地更改。

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

教你的手指不要使用git reset --hard,总有一天会有回报的。

如果你幸运地有相同的文件打开在另一个编辑器(例如。Sublime Text)试试按ctrl-z键。它救了我。

当我在做一个本地项目时,我想把它移动到GitHub上,然后创建一个新的存储库。当我试图用.gitignore将所有这些文件添加到新的存储库中时,我不小心添加了一个错误的文件,然后试图清除它。

我运行git reset --hard origin/master

然后我所有的本地文件都被删除了,因为回购是空的。我以为一切都消失了。

这招对我很管用:

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

是的,你可以从硬复位中恢复在git中。

使用:

git reflog

获取提交的标识符。 然后使用:< / p >

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

这招救了我几次命。

您可以找到reflog 在这里的文档。

如果我丢失了一些零钱,我通常会这么做。

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

我发现在git reset --hard <commit>之前任何未提交的文件都会从git历史中删除。然而,我很幸运,在我紧张的整个过程中一直保持我的代码编辑器会话打开,我发现在每个受影响的文件中,一个简单的control + z将文件的状态返回到Git重置之前的版本,所以我没有特别要求它重置所有内容。# EYZ2

如果您正在Netbeans上开发,请查看文件选项卡和文件编辑区域之间的内容。这里有“来源”和“历史”。在“历史记录”中,你会看到使用版本控制(git/other)所做的更改,但也有本地所做的更改。在这种情况下,局部更改可以拯救您。

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

  fatal: refusing to merge unrelated histories

所以我运行了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

(# EYZ0)

如果你使用的是(任何最新的)macOS,即使你不在时间机器磁盘上,操作系统也会保存每小时一次的备份,称为 # EYZ0。< / p >

进入时间机器,导航到你丢失的文件。操作系统会问你:

The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?

你应该能够恢复你丢失的文件。

以后你可以使用VSCode和ext: GitLens - Git增压,所以你可以用这个扩展反转你的代码

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

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

您只能恢复丢失的阶段性(git add)更改。

执行此命令可以方便地恢复

步骤:1进入工程根目录执行该命令

npx git-recover

一步:2输入恢复目录路径如下

/Users/apple/RecoveryDirectory

你会在RecoveryDirectory中丢失文件

enter image description here

对于那些丢失了unstaging &未提交的更改

这只会工作,如果你没有广泛编辑您的文件后再次重置。

尝试在VSCode中撤销文件更改

当我正在构建一个特性时,我的利益相关者决定去定义它的范围,我就做了git reset —-hard。一小时后,同样的利益相关者改变了主意。

我休息了一会儿又回来了。在我看到他们改变主意后,我正在做然后我决定尝试撤销这些文件,它起作用了!我设法拿回了所有的作业。

我遇到了这样一个场景,我签出了本地更改,但没有提交或存储它们。据我所知,没有任何命令能帮助我。对我有用的是CTRL+Z。

CTRL + Z

偶然的机会,我所有的文件都在编辑器中打开,所以在编辑器中,我只需按CTRL+Z所需的文件,这解决了我的问题

PS:我用的是Sublime文本编辑器。