如何在不丢失文件的情况下撤消git commit?

时间:2018-12-16 19:29:16

标签: git version-control

这是我上班时经常发生的事情:

[user@macmini ~/code/project $] git add .
[user@macmini ~/code/project $] git commit -m "Fixed whatever bug"
[master 93a3c47] Fixed whatever bug
 3 files changed, 290 insertions(+)
 create mode 100644 .DS_Store
 create mode 100755 some-code.js
 create mode 100755 some-other-code.js

如您所见,我意外地提交了.DS_Store文件,就像在您在Finder中打开文件夹后macOS所创建的.DS_Store文件一样。

在这种情况下,我通常会再次克隆存储库,将新代码复制并粘贴到其中,然后在没有git reset --hard HEAD的情况下再次提交。但是我知道这不是干净的方法。

那么,如何清除撤消提交?我已经尝试过char * _list,但它也会删除我的新文件。

1 个答案:

答案 0 :(得分:4)

git reset HEAD~1

这将“撤消”您的上一次提交,而无需触摸您的工作目录(我们的任何文件)。它与git reset --mixed HEAD~1相同。您还可以执行git reset --soft HEAD~1,这会将所有文件都标记为提交。

如果您最喜欢自己的提交,但只想对其内容或提交消息进行少量更改,则可以修改当前提交:

git rm .DS_Store
git commit --amend

这将提示您编辑提交消息(您可以保持不变),然后使用所做的更改来修改提交。


git reset的基本含义是“将当前分支移动到给定的提交”,而HEAD~1的含义是“上一个提交”。您命令的唯一问题是它包含--hard,它说:“哦,还要使我的所有文件看起来像在提交中一样”。

分支只是引用特定提交的标签;可以自由移动它(尽管如果您已推动分支并将其向后移动,则在尝试推动或拉动时会遇到问题)。

如果您觉得需要重新克隆存储库,则git中几乎总是有更好的解决方案。在git中提交,其中的文件可以撤消,重做,移动,有时甚至可以复活。另外,提交是本地:只有在您按下后,才会有人看到它们。