如果你不知道如何工作,撤销提交有点可怕。但是如果你理解的话,这实际上非常容易。
假设你有这个,其中 C 是你的 HEAD,(F)是你文件的状态。
(F)
A-B-C
↑
master
你想要提交 C 并且永远不会再看到它 。你做这个:
git reset --hard HEAD~1
结果是:
(F)
A-B
↑
master
现在 B 是 HEAD。因为您使用了--hard
,所以您的文件将重置为它们在提交 B 时的状态。
啊,但是假设提交 C 不是灾难,但只是有点偏。您希望撤消提交,但在进行更好的提交之前,请保留更改以进行一些编辑。从这里开始,用 C 作为你的 HEAD:
(F)
A-B-C
↑
master
你可以做到这一点,离开--hard
:
git reset HEAD~1
在这种情况下,结果是:
(F)
A-B-C
↑
master
在这两种情况下,HEAD 只是指向最新提交的指针。当你执行git reset HEAD~1
,你告诉 Git 将 HEAD 指针移回一次提交。但是(除非你使用--hard
)你保留文件原样。所以现在git status
显示你已经检查过 C 的变化。你没有丢失任何东西!
对于最轻微的触摸,您甚至可以撤消提交但保留文件和索引 :
git reset --soft HEAD~1
这不仅会使您的文件单独存在,甚至会使您的索引单独存在。当你执行git status
,你会看到索引中的文件和以前一样。实际上,在这个命令之后,你可以执行git commit
然后你将重做你刚刚提交的同一个提交。
还有一件事: 假设你在第一个例子中销毁了一个提交 , 但后来发现你需要它呢?运气好,对吗?
不, 还是有办法把它找回来。输入git reflog
,你会看到你已经移动的(部分)提交 sha 的列表。找到你销毁的提交,并执行以下操作:
git checkout -b someNewBranchName shaYouDestroyed
你现在已经复活了这个提交。提交实际上并没有在 Git 中被摧毁大约 90 天,所以你通常可以回去拯救一个你并不想要摆脱的东西。