git reset 是用来撤回代码的,本质就是修改当前的HEAD指针的指向(移动当前HEAD以及它所指向的branch)。
git撤回代码有三种方式,分别是--hard、--soft、--mixed。使用方式是在命令后面加上相应的HEAD或者commit ID。如(git reset --hard <commit ID>)。三种方式的区别总结如下。
git reset --hard <commit ID >后,本地电脑上的工作区(working tree )内容、暂存区(index/stage)内容以及Repository的内容,都会恢复到<commit ID>那个节点的代码,并且之前<commit ID>后面的所有<commit ID>都会被删除,所以,带上--hard参数后,所有未add的修改(也就是working tree )的修改、暂存区的修改(已经add过)以及commit到Repository的修改都会被删除,在很明确地知道某些修改的不需要的情况下,就可以使用--hard参数。
git reset --soft的话,工作区(working tree )和暂存区(index/stage)的内容都不会被修改,不过--soft后所带来的差异(就是目标commit ID)以后,所带来的所有的修改,会被保存到暂存区,也就是相当于git add 后但是没commit前,并且--soft后,目标commit ID后面的所有commit ID也会消失,其实是任意一种方式都会这样,因为reset操作,本来就是要撤销提交的,那么目标commit ID后面的commit ID肯定是要被删除的,要不就不叫撤销。
git reset --mixed 的话,只会保留工作区(working tree) 的修改,暂存区以及--mixed带来的差异,会被全部放到工作区中,也就是相当于没有git add之前的状态。如果这时候不想保留修改内容,可以直接git checkout <file>即可。