是否可以撤消由以下命令引起的更改?如果是,怎么办?
git reset --hard HEAD~1
是否可以撤消由以下命令引起的更改?如果是,怎么办?
git reset --hard HEAD~1
当前回答
我刚在错误的项目上做了一个硬重置。拯救我生命的是Eclipse的本地历史。据说IntelliJ Idea也有一个,你的编辑也是如此,值得检查:
关于本地历史的Eclipse帮助主题http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F
其他回答
答案隐藏在上面的详细响应中,您可以简单地执行以下操作:
$> git reset --hard HEAD@{1}
(参见git-relog show的输出)
如果您还没有对存储库进行垃圾收集(例如,使用git重新打包-d或git gc,但请注意垃圾收集也可以自动进行),那么您的提交仍然存在,只是无法通过HEAD访问。
您可以尝试通过查看git fsck的输出来查找提交。
较新版本的Git有一种叫做“reflog”的东西,它是对ref所做的所有更改的日志(与对存储库内容所做的更改相反)。因此,例如,每次您切换HEAD时(即每次执行git签出以切换分支时),都会被记录。当然,你的git重置也操纵了HEAD,所以它也被记录了下来。您可以以类似于访问存储库的旧状态的方式访问ref的旧状态,方法是使用@符号而不是~,如git-resetHEAD@{1}。
我花了一段时间才明白HEAD@{1}和HEAD~1之间的区别,所以这里有一个小解释:
git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog
因此,HEAD~1表示“在HEAD当前指向的提交之前进行提交”,而HEAD@{1}表示“在其当前指向的位置之前进行HEAD指向的提交”。
这将很容易让您找到丢失的提交并恢复它。
如果Git尚未垃圾收集,则可以恢复它。
使用fsck获取悬空提交的概述:
$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
使用rebase恢复悬空提交:
$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
数字刷新
在列表中找到提交sha,然后将其复制并粘贴到以下命令中:
git cherry pick<the sha>
制作了一个很小的脚本,以便稍微容易地找到要查找的提交:
git fsck--lost found | grep commit | cut-d“”-f 3 | xargs-i git show \{\}| egrp“^commit |日期:”
是的,它可以用锥子或类似的东西做得更漂亮,但它很简单,我只是需要它。可能会为其他人节省30秒。