2014-03-12 80 views
10

我做了一个承诺,但现在它是一种很难看到什么我都变了。我可以关闭过程做一个git的差异,但我宁愿撤消最后一次提交,并让我的机智所有的变化,使我的IDE(PyCharm)只是表明我哪些文件已被更改。如何撤消git中的最后一个提交,但保留我的更改为unstaged?

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

+2

小一点:你真的不永远_remove_从git的历史承诺。相反,你删除指向它们的指针(即分支)。最终他们将被垃圾收集。如果你搞砸了某些东西并想回去,你可以在'reflog'中找到这些悬而未决的提交。 –

回答

8

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

所以提交被撤销,但文件仍然期待他们之前的方式。没有什么东西上演到索引。

+0

我只是跑'git的复位--soft',但是当我运行'git hist'我仍然看到我的最后一次提交的在那里。所以我想这不是我的问题的解决方案。任何其他想法? – kramer65

+1

提交仍在历史中,但“HEAD”不再指向它。这是一个悬而未决的参考,并将被垃圾收集。 –

+1

作为提示;最后通过'git reset --soft <最后提交的散列>'成功完成。插入已经为我解决了。不管怎么说,还是要谢谢你! – kramer65

2

正如彼得说,我会跟git reset --soft去这应该离开你的这两个指标,在机智工作目录。在你的情况下,如果你想返回1提交,你可以使用git reset --soft HEAD~指向当前HEAD的父提交的分支;您的索引和工作目录仍将包含您更改的文件。

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

4

我想撇下了--soft在其他两个答案,一个简单的git reset @^去(或git reset HEAD^在旧版本的Git),这将默认为git reset --mixed @^。不同之处在于软重置会使文件进行提交,这不像您想要的那样。如果你真的想撤销提交,你应该也可以取消这些更改,这是默认的做法。在一般情况下,我发现这比软重置更有用,这可能是为什么混合是默认设置。

+0

这应该是被接受的答案 - 更简单,正是OP想要的。 – chetstone