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

Che*_*ony 2 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
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,我通常会再次克隆存储库,将新代码复制并粘贴到其中,然后再次提交而不使用.DS_Store。但是我知道这不是干净的方法。

那么,如何彻底撤消提交?我已经尝试过,git reset --hard HEAD但是它也会删除我的新文件。

Aas*_*set 6

git reset HEAD~1
Run Code Online (Sandbox Code Playgroud)

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

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

git rm .DS_Store
git commit --amend
Run Code Online (Sandbox Code Playgroud)

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


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

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

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