前几天在写项目的时候发现写错了需要回退,就百度了一下这两者的区别。reset指的是回滚,也就是将会从当前版本直接回退到你指定的版本,并将该版本之后的提交都抹去(网上看可以通过git -reflog来找回)。而revert则是指反转,意思有点像删除该版本的修改信息,比如操作a是hello,然后提交a,操作b是world然后提交b。那么revert b操作的版本号就会删除world保留hello,而如果操作b之后接操作c  “Android studio”然后提交c ,这个时候revert b的版本号则是保留了a和c的操作,删除了b的操作。当然实际情况如果b和c操作改到了同一个文件那么有可能会有冲突(没有实验过)。

具体原因:每一次更新git都会在一条时间线上做增加节点(类似于链表,前提是没分支),head指针会指向最新的节点,假设一共有四个版本,称为版本a,b,c,d。你想从d版本直接跳到a版本就用reset,结果就是a以后的版本都会给删除,时间线就只有a了,如果你选择了revert a ,就会生成一个版本e,这个e有b c d的修改内容,不会有a的。

而reset和revert的程度也可以指定,hard mixed soft,一般都会选择hard。如果想直接回滚到倒数第三个版本就可以用git reset --hard HEAD~3