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

Posted

技术标签:

【中文标题】如何撤消 git 中的最后一次提交,但保持我的更改未暂存?【英文标题】:How to undo the last commit in git, but keep my changes as unstaged? 【发布时间】:2014-04-16 19:53:49 【问题描述】:

我已提交,但现在很难看到我所做的全部更改。我当然可以做一个 git diff,但我宁愿撤消最后一次提交,并保持我的所有更改都完好无损,以便我的 IDE (PyCharm) 简单地显示哪些文件已更改。

那么有没有办法撤消最后一次提交(真的删除它)但仍然保持我的更改完好无损?欢迎所有提示!

【问题讨论】:

小点:你并没有真正从 git 历史记录中 remove 提交。相反,您删除指向它们的指针(即分支)。最终它们将被垃圾收集。如果你把事情搞砸了,想回去,你可以在reflog找到这些悬空提交。 我还建议您熟悉 JetBrains(PyCharm 等)IDE 中的内置 git explorer,因为它们会显示您在特定提交中所做的更改,而无需“取消提交”您的更改。如果您刚刚提交了某些内容,此解决方案可能会起作用,但想象一下如果您需要回到上个月提交的内容会发生什么! 【参考方案1】:

我将在其他两个答案中省略--soft,并使用简单的git reset @^(或旧版本的git 中的git reset HEAD^),默认为git reset --mixed @^。不同之处在于软重置会使文件暂存以供提交,这听起来不像您想要做的。如果您真的想撤消提交,您还应该取消暂存更改,这是默认设置。我发现这在一般情况下比软重置更有用,这可能就是为什么默认混合是。

【讨论】:

这应该是公认的答案——更简单,也正是 OP 想要的。【参考方案2】:

正如彼得所说,我会选择 git reset --soft,它应该使您的索引和工作目录都保持完好。

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

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

【讨论】:

天哪,伙计,你一个人已经解决了这个问题,这应该是被接受和最赞成的答案。最后没有HEAD~ git reset --soft 什么也没做。 很高兴它有帮助 =D【参考方案3】:

这听起来像是 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.

所以提交被撤消了,但文件看起来仍然像以前一样。没有任何内容被暂存到索引中。

【讨论】:

我刚刚运行了git reset --soft,但是当我运行git hist 时,我仍然可以看到我的最后一次提交。所以我想这不是我的问题的解决方案。还有其他想法吗? 该提交仍在历史记录中,但HEAD 不再指向它。它是一个悬空引用,将被垃圾回收。 作为提示; a 终于通过git reset --soft &lt;hash of last commit&gt; 成功了。插入终于为我解决了。还是谢谢!

以上是关于如何撤消 git 中的最后一次提交,但保持我的更改未暂存?的主要内容,如果未能解决你的问题,请参考以下文章

powershell Git撤消上次提交并保持本地更改

在 GIT 中撤消删除

如何撤消多个 git 提交? [复制]

[转]Git 撤销操作

Git 撤消操作

git 使用详解—— 3种撤消操作