如果您不知道提交的工作方式,则撤消提交会有些吓人。但是,如果您理解的话,实际上非常容易。
假设您有这个,其中C是您的HEAD,(F)是您的文件状态。
(F)
A-B-C
↑
master
您想核对commit 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都只是指向最新提交的指针。当执行a时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天,因此您通常可以回去拯救不是故意要摆脱的一个。