如何撤消git中的最后一次提交,但保持我的更改未过时?

如何撤消git中的最后一次提交,但保持我的更改未过时?,git,git-revert,git-stage,Git,Git Revert,Git Stage,我已经做出了承诺,但现在很难看到我改变了什么。我当然可以做git-diff,但我更愿意撤消最后一次提交并保持所有更改,这样我的IDE(PyCharm)就可以简单地显示哪些文件已经更改 那么,有没有一种方法可以撤消上一次提交(真的删除它),但仍然保持我的更改得体?欢迎所有提示 这听起来像是git reset--soft的工作,它的帮助(git help reset)说: --soft Does not touch the index file nor the working tree at

我已经做出了承诺,但现在很难看到我改变了什么。我当然可以做git-diff,但我更愿意撤消最后一次提交并保持所有更改,这样我的IDE(PyCharm)就可以简单地显示哪些文件已经更改


那么,有没有一种方法可以撤消上一次提交(真的删除它),但仍然保持我的更改得体?欢迎所有提示

这听起来像是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.
--soft
根本不接触索引文件或工作树
(但将头部重置为,就像所有模式一样)。
这将保留所有已更改文件的“更改”
git status会这样说。

因此,提交已撤消,但文件的外观仍与以前相同。索引中没有任何内容。

正如Peter所说,我将使用git reset--soft,它将使您的索引和工作目录保持不变

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


一篇关于重置的便利文章:

我会在其他两个答案中省去
--soft
,然后使用一个简单的
git reset^
(或者在旧版本的git中是
git reset HEAD^
),它将默认为
git reset--mixed^
。不同之处在于软重置会让文件处于提交阶段,这听起来不像是您想要做的。如果您真的想撤销提交,您可能还应该取消对更改的显示,这是默认设置所做的。我发现这在一般情况下比软重置有用得多,这可能就是为什么默认情况下使用mixed的原因。

小点:您永远不会从git历史记录中删除提交。而是删除指向它们的指针(即分支)。最终它们将被垃圾收集。如果你把事情搞砸了,想回去,你可以在
reflog
中找到这些悬而未决的提交。我刚刚运行了
git reset--soft
,但当我运行
git hist
时,我仍然在那里看到我的最后一次提交。所以我想这不是解决我问题的办法。还有其他想法吗?提交仍在历史中,但
HEAD
不再指向它。这是一个悬空的引用,将被垃圾收集。作为提示;通过执行
git reset--soft
,a终于成功了。我终于解决了这个问题。无论如何谢谢你!这应该是公认的答案——更简单,也正是OP想要的。天哪,老兄,只有你一个人解决了这个问题,这应该是公认的、最上等的答案。没有
HEAD ~
在最后
git reset--soft
什么也没做。很高兴它帮了我的忙=D