问题 如何撤消git中的最后一次提交,但保持我的更改为未分级?


我做了一个提交,但现在有点难以看到我改变了什么。我当然可以做一个git diff,但我宁愿撤消上次提交并保持我的所有更改,以便我的IDE(PyCharm)只显示我已经更改了哪些文件。

那么有没有办法撤消上次提交(真的删除它),但仍保持我的变化?欢迎所有提示!


11117
2018-03-12 15:05


起源

小点:你真的没有 去掉 承诺从git历史。相反,您删除指针(即分支)。最终他们将被垃圾收集。如果你搞砸了什么并且想要回去,你可以在中找到这些悬挂的提交 reflog。 - Drew Noakes


答案:


这听起来像是一份工作 git reset --soft,谁的帮助(git help reset)这样说:

--soft
    Does not touch the index file nor the working tree at all
    (but resets the head to <commit>, just like all modes do).
    This leaves all your changed files "Changes to be
    committed", as git status would put it.

因此撤消提交,但文件仍然像以前一样。没有任何东西进入索引。


9
2018-03-12 15:10



我跑了 git reset --soft,但是当我跑 git hist 我仍然看到我在那里的最后一次提交。所以我想这不是我的问题的解决方案。还有其他想法吗? - kramer65
提交仍然在历史中,但是 HEAD 不再指向它。这是一个悬空参考,将被垃圾收集。 - Peter Westlake
作为小费;最后成功了 git reset --soft <hash of last commit>。插入终于解决了它。不管怎么说,还是要谢谢你! - kramer65


我会离开的 --soft 在另外两个答案和简单的去 git reset @^ (要么 git reset HEAD^ 在旧版本的git)中,默认为 git reset --mixed @^。不同之处在于软复位会使文件暂存以进行提交,这不是您想要做的事情。如果您确实要撤消提交,则还应该取消暂时更改,这是默认设置。我发现在一般情况下这比软复位更有用,这可能是默认混合的原因。


4
2018-03-12 15:39



这应该是公认的答案 - 更简单,也就是OP想要的。 - chetstone


正如彼得所说,我会一起去 git reset --soft 哪个应该保留你的索引和工作目录。

在您的情况下,如果您想返回1提交,您可以使用 git reset --soft HEAD~ 将分支指向当前HEAD的父提交;您的索引和工作目录仍将包含您更改的文件。

一篇关于重置的方便文章: http://git-scm.com/blog/2011/07/11/reset.html


2
2018-03-12 15:31