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

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

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

【问题讨论】:

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

标签: git git-revert git-stage


【解决方案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; 成功了。插入终于为我解决了。还是谢谢!
猜你喜欢
  • 2020-12-11
  • 2017-08-06
  • 2016-09-22
  • 2014-02-13
  • 1970-01-01
  • 2013-04-16
  • 2013-07-03
  • 2015-07-27
  • 2021-09-30
相关资源
最近更新 更多