如何从git reset --hard HEAD
中恢复未提交的更改到工作目录?
如何从git reset --hard HEAD
中恢复未提交的更改到工作目录?
$ 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 checkout HEAD@{19}
命令可以让我以分离状态检出已丢失的文件,然后使用 git checkout -b 新分支名
命令将它们以“附加”的状态添加回仓库。 - NightOwl888git checkout -b 新分支名称
将其变成一个“真正”的分支,以便再次返回。《Pragmatic Version Control Using Git》这本书用简单易懂的语言很好地解释了Git。 - NightOwl888通常情况下,您无法恢复未提交的更改。
先前暂存(git add
)的更改应该可以从索引对象中恢复,因此如果您这样做了,请使用git fsck --lost-found
定位与其相关的对象。(这会将对象写入.git/lost-found/
目录; 然后你可以使用git show <filename>
查看每个文件的内容。)
如果没有,那么答案是:查看您的备份。也许您的编辑器/IDE在/tmp或C:\TEMP之类的位置存储临时副本。 [1]
git reset HEAD@{1}
这将恢复到先前的 HEAD。git reset HEAD@{1}
导致了一个错误,结果是error: unknown switch ``e'
。解决方法是用单引号转义花括号,像这样:git reset 'HEAD@{1}'
,因为花括号对于powershell有不同的含义。 - Batufor fname in $(ls .git/lost-found/other/); do echo $fname:; cat .git/lost-found/other/$fname; read -n 1 -p "Continue?"; echo; done
- ncoghlangit 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 .
命令)时,此方法才有效。如果文件未在索引中,那么它们将无法恢复。#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "正在处理 $f 文件..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
- rwolst不只是未提交的更改,但您可以在Git中执行硬重置后恢复之前提交的更改。
用法:
git reflog
获取您提交的标识符。 然后使用:
git reset --hard <commit-id-retrieved-using-reflog>
这个技巧曾经救过我几次大难。
你可以在这里找到reflog的文档。
git reset --hard
来恢复 git reset --hard
可能看起来反直觉,但如果你不使用 --hard
选项,你的工作区将留下条目,这些条目会有效地撤消你刚刚恢复的工作。 - Ryan H.当我在处理本地项目时,我想将其移动到GitHub并创建一个新的存储库。当我尝试使用.gitignore将所有这些文件添加到新的存储库中时,我不小心添加了一个错误的文件,然后尝试清除它。
我运行了git reset --hard origin/master
然后我的所有本地文件都被删除了,因为该存储库是空的。我以为一切都消失了。
这对我有用:
git reflog show
git reset HEAD@{1}
git push
http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/
git reflog
不起作用,因为我没有提交更改。git fsck --lost-found
可以恢复已暂存的文件,但并没有暂存所有文件。IntelliJ的本地历史记录完美地恢复了我的未保存文件,我非常感激这个功能。 - Denes Papp我刚刚执行了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
相同的操作,但不会丢弃本地更改。
如果您既想要放弃未提交的更改,又想要移动HEAD
和当前分支的最新历史记录,则git stash && git reset --keep
是您的好朋友。
教导您的手指不要使用git reset --hard
,这将在某一天得到回报。
git stash && git reset --hard
,那么这将清除任何已经存储的内容,对吗? - jxramosgit reset --hard
不会丢弃暂存区。git stash
是 git reset --hard
的替代品,因为它可以从您的工作区中移除未提交的更改,但是它会将这些更改安全保留,而不是永久地丢弃它们。 - Matthieu Moy如果我丢了一些更改,这就是我通常做的事情。
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
命令。
IntelliJ具有可通过历史命令访问的临时文件夹: