有什么方法可以从中恢复对工作目录的未提交更改git reset --hard HEAD
?
git reset --hard somewhere
是少数几个真正危险的git命令之一。
有什么方法可以从中恢复对工作目录的未提交更改git reset --hard HEAD
?
git reset --hard somewhere
是少数几个真正危险的git命令之一。
Answers:
通常,您无法取回未提交的更改。
以前分阶段进行的更改(git add
)应该可以从索引对象中恢复,因此,如果这样做了,请使用git fsck --lost-found
来查找与其相关的对象。(这会将对象写入.git/lost-found/
目录;从那里您可以git show <filename>
用来查看每个文件的内容。)
如果没有,这里的答案将是:查看您的备份。也许您的编辑器/ IDE将临时副本存储在/ tmp或C:\ TEMP下,诸如此类。[1]
git reset HEAD@{1}
这将还原到先前的HEAD
[1] vim例如,可选地存储持久性的undo,eclipse IDE存储本地历史记录;这样的功能可能会节省您的**
从这个回答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}
您的一天回来了!:)
git checkout HEAD@{19}
允许我以分离状态签出丢失的文件。然后用于git checkout -b new-branch-name
将它们以“已附加”状态添加回存储库。
git checkout -b new-branch-name
。《使用Git进行实用版本控制》一书善于用简单的术语解释Git。
我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 .
)时,此方法才有效。如果文件不在索引中,则它们将丢失。
lost-found
。但是我可以然后git show
获取内容。
#!/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" let COUNTER=COUNTER+1 done
是的,您可以从 git 的硬重置中恢复。
采用:
git reflog
获取提交的标识符。然后使用:
git reset --hard <commit-id-retrieved-using-reflog>
这个把戏挽救了我一生。
您可以在此处找到reflog的文档。
git reset --hard
其他位置恢复可能看起来很直观,git reset --hard
但是如果您不使用该--hard
开关,则将在工作区中留下可以有效还原刚刚恢复的工作的条目。
git log
时没有看到提交的ID。随着git reflog
我可以看到提交ID
在进行本地项目时,我想将其移至GitHub,然后创建一个新的存储库。当我尝试使用.gitignore将所有这些文件添加到新存储库时,我不小心添加了错误的文件,然后尝试清除它。
我跑了git reset --hard origin/master
:P
然后,我的所有本地文件都删除了,因为该存储库为空。我以为一切都消失了。
这救了我一命:
git reflog show
git reset HEAD@{1}
git push
希望它能挽救另一条生命。
git reset HEAD@\{27\}
,谢谢!
git reflog show
从第一个提交进行检查,然后使用git reset HEAD@{number}
如果您使用类似IntelliJ的工具:
在上下文菜单上,选择“本地历史记录”,然后在子菜单上单击“显示历史记录”:
项目或文件夹的本地历史记录视图向您显示最近几天完成的所有操作。在对话框下部的“操作”列中,选择要回滚的操作。[...]这样,对话框的上部显示了已更改文件的树视图。如果您只想还原已删除的文件,而不管此后进行的其他任何更改,则可以在树视图中选择文件Lost.txt,然后单击“还原”按钮。
http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/
这只是让我的屁股火了!
git reflog
没用,因为我没有提交更改。git fsck --lost-found
适用于暂存文件,但并非所有文件都已暂存。IntelliJ的本地历史记录完美地恢复了我未保存的文件,我非常感谢此功能
根据定义,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
,它可以从工作树中删除未提交的更改,除了可以确保它们的安全而不是永久地将其丢弃。
如果您不小心硬重置了提交,请执行此操作,
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 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从未存储此信息。因此,基本上git
无法为您恢复它。
但是,如果您只是这样做git diff
,则可以通过以下3个简单步骤使用终端输出来恢复。
git diff
。将o / p保存在名为diff.patch的文件中patch -p1 < diff.patch
)您已保存!:)
注意:将数据从终端复制到文件时,请小心并清楚地看到数据是连续输出的,并且不包含任何冗余数据(由于按下了向上和向下箭头)。否则您可能会搞砸。
我遇到了同样的问题,我快要疯了....最初我提交了项目并合并了..后来当我尝试运行时,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
希望这可以帮助
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以获取更多信息。
我git reset --hard
错误地在错误的项目上做过(我知道...)。我刚处理过一个文件,在运行命令期间和之后该文件仍处于打开状态。
即使我没有提交,也可以使用simple检索旧文件COMMAND + Z
。
如果您使用相同的代码打开了IDE,请尝试对进行了更改的每个文件执行ctrl + z。git reset --hard之后,它帮助我恢复了我未提交的更改。
git reset
。您不需要该命令,它很危险,所以不要使用它。要将分支返回到先前的提交,git rebase -i
并删除您不需要的提交,或git checkout
(分离头部),然后git branch -M
移动分支提示。第一个将拒绝运行本地更改,而第二个仅在本地修改的文件在两个修订版本之间没有差异的情况下运行。