如何撤消 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 <hash of last commit>
成功了。插入终于为我解决了。还是谢谢!以上是关于如何撤消 git 中的最后一次提交,但保持我的更改未暂存?的主要内容,如果未能解决你的问题,请参考以下文章