有没有办法从git reset --hard HEAD
恢复对工作目录的未提交更改?
答案 0 :(得分:365)
回答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}
你回来了! :)
答案 1 :(得分:362)
你一般无法取回未提交的更改。
以前暂存的更改(git add
)应该可以从索引对象中恢复,因此如果您这样做,请使用git fsck --lost-found
来查找与其相关的对象。 (这会将对象写入.git/lost-found/
目录;从那里您可以使用git show <filename>
查看每个文件的内容。)
如果没有,这里的答案是:看看你的备份。 也许您的编辑器/ IDE会在/ tmp或C:\ TEMP下存储临时副本等等。[1]
git reset HEAD@{1}
这将恢复到之前的HEAD
[1] vim ,例如可选地存储持久性撤销, eclipse IDE存储本地历史;这些功能可能会保存你的**
答案 2 :(得分:285)
我今天偶然在我的回购邮件上运行了git reset --hard
,而今天也有未提交的更改。为了得到它,我运行了git fsck --lost-found
,它将所有未引用的blob写入<path to repo>/.git/lost-found/
。由于文件未提交,我在other
内的<path to repo>/.git/lost-found/
目录中找到了它们。从那里,我可以使用git show <filename>
查看未提交的文件,复制blob并重命名它们。
注意:仅当您将要保存的文件添加到索引(使用git add .
)时才有效。如果文件不在索引中,则会丢失。
答案 3 :(得分:137)
是的,您可以通过git中的硬重置恢复。
使用:
git reflog
获取提交的标识符。 然后使用:
git reset --hard <commit-retrieved-using-reflog>
这招几次挽救了我的生命。
您可以找到reflog HERE的文档。
答案 4 :(得分:54)
当我在处理本地项目时,我想将其移至GitHub,然后创建一个新的存储库。当我尝试使用.gitignore将所有这些文件添加到新存储库时,我不小心添加了错误的文件然后尝试清除它。
我跑了git reset --hard origin/master
:P
然后删除了所有本地文件,因为repo为空。我以为一切都没了。
这拯救了我的生命:
git reflog show
git reset HEAD@{1}
git push
希望它能挽救另一种生命。
答案 5 :(得分:29)
我刚做git reset --hard
并丢失了所有未提交的更改。幸运的是,我使用编辑器(IntelliJ),我能够从本地历史中恢复更改。 Eclipse应该允许你这样做。
答案 6 :(得分:29)
如果你使用像IntelliJ这样的东西:
在上下文菜单中,选择“本地历史记录”,然后单击子菜单上的“显示历史记录”:
项目或文件夹的本地历史记录视图向您显示所有内容 你在过去几天里做过的事。在Action列中 在对话框的下半部分,选择要滚动的操作 背部。 [...]这样做,对话框的上半部分显示已更改文件的树视图。如果您只想恢复已删除的文件,无论此后所做的其他更改如何,您都可以在树视图中选择文件Lost.txt,然后单击“恢复”按钮。
http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/
这让我的屁股开火了!
答案 7 :(得分:15)
根据定义,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
,它会在一天内收回。
答案 8 :(得分: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 ...
将指针移回之前的提交,但保留您在最近提交结帐时所做的更改git reset --soft dadada
答案 9 :(得分:8)
信息丢失。
由于您没有提交,您的.git从未存储过此信息。因此,基本上git
无法为您恢复。
但是,如果您刚刚git diff
,有一种方法可以使用终端输出进行恢复,并执行以下3个简单步骤。
git diff
的o / p。将o / p保存在名为diff.patch patch -p1 < diff.patch
)你得救了! :)
注意:在将数据从终端复制到文件时,请注意并清楚地看到数据是连续输出且不包含任何冗余数据(由于按下向上和向下箭头)。否则你可能搞砸了。
答案 10 :(得分:6)
执行reset --hard HEAD
后,您可以取回提交。
使用“git reflog
”检查分支中HEAD
的历史记录。
您将在此处看到您的提交及其ID。
做一个
git reset {commit Id of the commit you want to bring back}
答案 11 :(得分:4)
如果你幸运地在另一个编辑器上打开了相同的文件(例如Sublime Text),请尝试使用ctrl-z。它只是救了我..
答案 12 :(得分:3)
如果您不小心硬重置了提交,请执行此操作,
xpath
假设driver.find_element_by_xpath("//a[@href='/p/BrDudIUBuNr/']//span[contains(@class,'glyphsSpriteVideo_large')]").get_attribute("aria-label")
是您希望返回的状态
答案 13 :(得分:3)
我遇到了同样的问题,而且我快要疯了...。最初我提交了该项目并合并了。
稍后当我尝试运行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
希望这会有所帮助
答案 14 :(得分:3)
我发现在{g}历史记录中删除git reset --hard <commit>
之前的任何未提交文件的困难方式。但是,我很幸运能够让我的代码编辑器会话保持打开状态,因为我发现在每个受影响的文件中都有一个简单的control + z
将文件的状态恢复为Git之前的版本如此强制重置我没有具体要求的所有内容。 Hooray!!
答案 15 :(得分:2)
如果您尝试使用以下代码:
null
由于某种原因而得到:
错误:未知开关“ e”
然后尝试将git reflog show
# head to recover to
git reset HEAD@{1}
用引号引起来
HEAD@{1}
答案 16 :(得分:2)
正确答案。好,现在我喜欢git。 :-)这是一个简单的食谱。
git log HEAD@{2}
git reset --hard HEAD@{2}
其中“ 2”是您提交所做更改的位置的数量。就我而言,被同事和老板打扰以帮助调试某些构建问题;因此,进行了两次硬重设;因此,HEAD和HEAD @ {1}被覆盖。哎呀,会失去我们的辛苦工作。
答案 17 :(得分:2)
我错误地对错误的项目做了git reset --hard
(我知道...)。我刚处理过一个文件,在运行命令期间和之后该文件仍处于打开状态。
即使我没有提交,我也可以使用简单的COMMAND + Z
来检索旧文件。
答案 18 :(得分:1)
来自此SO的参考答案,
运行git reflog后显示你要去提交9300f9d
运行git reset 9300f9d
后您可以执行git状态,然后您可能需要签出文件以恢复更改
git checkout - 文件路径/名称
答案 19 :(得分:1)
如果您正在使用 VS Code 并且碰巧打开了受影响的文件,您可以在每个文件的基础上撤消 Git 所做的更改。 (所以 CTRL
+ Z
)
答案 20 :(得分:0)
如果您正在使用Netbeans进行开发,请查看文件选项卡和文件编辑区域。有一个“来源”和“历史”。在“历史记录”中,您将看到使用版本控制(git / other)所做的更改,以及本地更改。在这种情况下,本地更改可以为您节省时间。
答案 21 :(得分:0)
当我们执行git reset --hard并删除所有本地未提交的更改时。要恢复更改 - 在IDE中单击该文件,将该文件与本地历史记录进行比较,该历史记录将按日期列出更改,我们可以恢复数据。你的一天得救了!
答案 22 :(得分:0)
(适用于部分用户的答案)
如果您使用的是(最新的)macOS,即使您不在Time Machine磁盘上,该操作系统也会保存每小时的备份,称为 local snapshots。
输入Time Machine并导航到丢失的文件。然后操作系统将询问您:
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?
您应该能够恢复丢失的文件。
答案 23 :(得分:0)
git reset HEAD@{4}
4是4步之前的更改。如果选择正确的步骤,它将显示从硬盘中删除的文件列表。然后做:
$ git reflog show
它将向您显示我们已经创建的本地提交历史记录。现在做:
$ git reset --hard 8c4d112
8c4d112是您要在那里重置硬盘的代码。让我们来看看 https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history以获得更多信息。
答案 24 :(得分:0)
如果您使用相同的代码打开了IDE,请尝试对进行了更改的每个文件执行ctrl + z。 git reset --hard之后,它帮助我恢复了我未提交的更改。
答案 25 :(得分:0)
稍后您可以将 VSCode 与 ext 一起使用:GitLens - Git 增压,因此您可以使用此扩展来反转您的代码
答案 26 :(得分:0)
IntelliJ 有一个可以通过 history 命令访问的临时文件夹:
1. Select the folder to revert files from in your navigation pane
2. Double tap the Shift key (shift-shift)
3. In the input box that pops up type Local History and press Enter
4. Select Show History
5. Now you can revert to the version you need.