有什么方法可以从git reset --hard HEAD恢复未提交的对工作目录的更改?
-
ID建议取消学习git reset。您不需要该命令及其危险,因此不要使用它。要使分支返回到先前的提交,请git rebase -i并放下您不想要的提交,或者先放git checkout(拆下头部),然后放下git branch -M,以移动分支提示。前者将拒绝使用本地更改运行,而后者将仅在本地修改的文件在两个修订版本之间没有差异的情况下运行。
-
@Jan假设您执行了git add --patch,然后意识到您已经上演了一些您不打算做的事情。您如何从中恢复(即清除暂存区域)而无需重置?
-
如果需要重置更改。使用git stash可能是一个好主意
-
@简我不相信。有完全正当的理由使用重置。
-
@ spaaarky21:是的,有。但是git reset --hard somewhere是为数不多的真正危险的git命令之一。
-
@Jan我同意,但是危险并不意味着您不应该使用它。只知道您在做什么,并要小心。 :)
-
与撤消git reset --hard HEAD?1无关,因为原始发稿人试图恢复未提交的更改。
-
另请参阅在执行git reset --hard HEAD ^之后恢复添加的文件。
-
另请参见意外还原为主要,丢失的未提交更改。
-
实际上,有时我认为,如果git开发人员在git reset --hard之前添加选项来临时存储所有未暂存/未提交的内容,则最好避免这种问题。
-
我还发现自己多次遇到此问题,并且挽救来自使用我的IDE的本地历史记录(如果您具有此功能)。绝对应该停止使用此可撤消命令。
-
@Predelnik那正是git stash save的作用。
-
@JanHudec人们真的不应该说要返回上一次提交时使用" git reset"!
-
@Michael,的确如此。要返回上一次提交,您可以说git checkout -B master master^(用当前分支名称替换master),并且您不会冒失去未提交状态的风险。不幸的是,git reset中两个功能(撤消更改和移动分支提示)的混合使用很不幸。 Git通常以reflog的形式提供相当不错的安全网,但是reset是其中的一个明显漏洞。
-
有时不使用git reset --hard是危险的。例如,当推送到远程仓库(尤其是强制推送)时,我总是对远程分支进行硬重置,然后在推送之前进行任何所需的更改,以确保仅删除所需的更改。
-
只是将其留在这里,听起来可能很蠢,但是我使用VSCode失败了,我在git reset --hard失败后没有关闭它。幸运的是,VSCode能够使用Ctrl + Z检索到以前的版本。希望它可以节省某人的一天:)
-
不使用git reset并不意味着它本身没有用或危险。偶尔发生在我身上的是将其记录在我的终端历史记录中,并且在没有注意到的情况下进行了两次上载,然后重置而不是编译。因此,至少要在单独的终端中进行:)
通常,您无法取回未提交的更改。
以前已分阶段进行的更改(git add)应该可以从索引对象中恢复,因此,如果这样做了,请使用git fsck --lost-found来查找与其相关的对象。 (这会将对象写入.git/lost-found/目录;从那里可以使用git show 查看每个文件的内容。)
如果没有,这里的答案将是:查看您的备份。也许您的编辑器/ IDE将临时副本存储在/ tmp或C: TEMP下,诸如此类。[1]
这将还原到先前的HEAD
[1] vim例如(可选)存储持久撤消,Eclipse IDE存储本地历史记录;这样的功能可能会节省您的**
-
Eclipse的本地历史记录-此外,由于某些更改已超过6天,因此我的Time Machine备份了Eclipses的本地历史记录!由于某些原因,由git管理的文件夹的Time Machine备份不包含我以前的更改。
-
您真是一个真正的救命助手! TextWrangler有文件备份。谢谢
-
您是救生员!重置并丢失我的更改后,Eclipse自动更新了该文件。按下Ctrl + Z后,它回滚到我需要的版本。
-
感谢您使用git reset HEAD@{1}拯救了我的生命
-
这是有关如何从Eclipse备份中恢复文件的说明链接。 wiki.eclipse.org/
-
幸运的是,我将TimeMachine设置为每小时进行一次备份,因此我能够从上次备份中获取文件。据我所知,它不会恢复隐藏文件,因此您应该直接从文件系统复制文件。
-
为什么git不能仅在重置期间甚至是临时备份未??提交的更改就没有意义。这是完全可以预防的问题。有这个功能吗?
-
IDE(IntelliJ)将更改保存在本地,从而节省了一天的时间。谢谢你的提示!
-
PHPStorm 2017.2:右键单击编辑器->本地历史记录->显示历史记录。但是,既然我几乎必须学习艰辛的方法,我认为我会遵循@JanHudecs的建议,即在可能的情况下偏爱git reset以外的替代方法。
-
我刚刚被PhpStorms当地历史保存
-
哇,这太神奇了。即使您从未提交过,它也能正常工作。
-
@BoudewijnAasman,只要有东西将对象放到对象数据库中,什么也没使它们过期(暂存,存储,它们都这样做)
-
git reset HEAD@{1}在powershell终端中导致错误,导致error: unknown switch ``e解决此问题的方法是使用单引号将花括号转义,例如:git reset HEAD@{1},因为curlies对于powershell具有不同的含义
-
关于vim和eclipse:很好的建议。我个人已经使用vim和eclipse来恢复不在git存储库中的旧代码。 eclipse的local history功能b / c特别有用,我认为它会更新您所做的每一次保存。
-
注意,git log HEAD@{1}还将显示丢失的提交,以便在重置之前进行检查。
-
确实,Eclipse中的本地历史记录(在我的情况下为Intellij)节省了恢复临时更改的时间,有关Intellij的文档,请访问:blog.jetbrains.com/idea/2008/01/
-
确实有救星!!!能够恢复密钥文件
-
只需完成git show-cd .gitlost-foundcommit; ls; git show abc123... > ~rescue.patch,然后使用git apply遍历补丁即可。
-
保存愉快!谢谢!
-
你救了我们的命
从这样的答案
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 checkout HEAD@{19}可使我以分离状态检出丢失的文件。然后使用git checkout -b new-branch-name将它们添加到处于"已附加"状态的存储库。
-
@ NightOwl888:Git新手在这里,我遇到了同样的问题,我的文件仍然不见了。您能否更详细地说明如何将文件恢复到"已附加"状态(或者您可以说明实际含义)?非常感谢!
-
@ user3385759-在Git中,当您在非分支的对象上使用checkout命令时,它将进入特殊的"分离头"模式。这意味着您实际上并没有指向分支,但是您可以查看在实体状态下签入的内容(在本例中为reflog条目)。从该状态开始,您可以将其变为"真实"分支,然后可以使用git checkout -b new-branch-name返回到该分支。 《使用Git进行实用版本控制》一书善于用简单的术语解释Git。
-
是的,NomNomCameron和Jesse Adelman说了什么。我错误地认为重置将重置为我的最后一次提交。不。它消灭了一切。这个答案使我免于一两天的重新创作工作。
我今天也意外地在仓库上运行了git reset --hard,而今天也进行了未提交的更改。为了找回它,我运行了git fsck --lost-found,它将所有未引用的Blob写入了/.git/lost-found/。由于文件尚未提交,因此我在/.git/lost-found/的other目录中找到了它们。从那里,我可以使用git show 看到未提交的文件,复制出blob,然后重命名它们。
注意:仅当您将要保存的文件添加到索引(使用git add .)时,此方法才有效。如果文件不在索引中,则它们将丢失。
-
谢谢你,幸运的是我做了git add。 git reset之前--hard ...
-
我只是在lost-found中带有提交引用的文件。但是然后我可以做git show来获取内容。
-
只是为了节省任何人的时间#!binbash cd PATH_TO_PROJECT.gitlost-foundother FILES=* COUNTER = 0 for f in $FILES do echo"Processing $f file..." git show $f >"PATH_TO_RECOVERY_DIRECTORY$COUNTER.m" let COUNTER=COUNTER+1 done
-
好吧,嗯,您可以在文本编辑器中打开它们,或使用cat或cp或...
是的,您可以从git的硬重置中恢复。
采用:
获取提交的标识符。
然后使用:
1
| git reset --hard <commit-retrieved-using-reflog> |
这个把戏挽救了我一生。
您可以在此处找到reflog的文档。
-
到目前为止,我认为这是最好,最简洁的答案。使用另一个git reset --hard从git reset --hard恢复似乎是不直观的,但是如果您不使用--hard开关,则会在工作区中留下可以有效还原刚刚恢复的工作的条目。
-
奇迹般有效!先前的答案(stackoverflow.com/questions/5788037/recover-from-git-reset-hard/)对我不起作用。
-
该死,我使用git show 67db6072093a119fef0cfe946191e09d861360d5 > path-to-file,但是使用git reset --hard 可以为我节省一些乏味。至少我知道下一次(我希望不会再有下一次)。
-
这个答案是不正确的。此方法仅恢复先前提交的更改。它将无法还原未提交的更改(这是有关此问题的内容)。
-
这就是为什么接受的答案以"您通常无法取回未提交的更改"开头的原因。我认为这对某些人可能仍然有用。 :)
-
该解决方案对我有用。我进行了一次硬重置,然后当我使用git log时,我没有看到提交的ID。使用git reflog,我可以看到提交ID
-
这是最好的...
在进行本地项目时,我想将其移至GitHub,然后创建一个新的存储库。当我尝试使用.gitignore将所有这些文件添加到新存储库时,我不小心添加了错误的文件,然后尝试清除它。
我跑了git reset --hard origin/master:P
然后,我的所有本地文件都删除了,因为该存储库为空。我以为一切都消失了。
这救了我一命:
1 2 3
| git reflog show
git reset HEAD@{1}
git push |
希望它能挽救另一条生命。
-
对我来说是git reset HEAD@\{27\} ,谢谢!
-
我有7次提交要重置,我使用git reflog show进行检查,从第一次提交起,我使用git reset HEAD@{number}
如果您使用类似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,它将一天归还。
-
因此,如果git stash && git reset --hard会清除所有隐藏的内容,对吗?
-
不,git reset --hard不会丢弃该存储。 git stash是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}是您希望返回的状态
-
如果您在PowerShell上执行此操作,则对我而言非常理想,请确保将其编写为git reset HEAD @ {2},否则将无法在Powershell中工作
信息丢失。
由于您未提交,因此您的.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}用引号引起来
正确答案。好,现在我喜欢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中单击文件,将文件与"本地历史记录"进行比较,"本地历史记录"将按日期列出更改,我们可以恢复数据。您的一天已保存!