Git revert 和 git reset 的区别
1. git reset 是把HEAD指针向后移动了一下,而git revert是HEAD指针继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容(如下图):
例子:同样是从C版本退回到B版本,git revert 和git reset --hard 的处理逻辑
Git revert commit_id 回退前(用git log --pretty=oneline查看的结果):HEAD 指针指向 版本C 也就是 版本3
Git revert commit_id 回退后 (用git log --pretty=oneline查看的结果):HEAD 指针指向 新版本(Revert "版本B") 也就是 版本4 ,之前的 版本3 被保留下来了
git reset --hard commit_id 回退前(用git log --pretty=oneline查看的结果):HEAD 指针指向 版本3
git reset --hard commit_id 回退后(用git log --pretty=oneline查看的结果): HEAD 指针指向 版本2,之前的 版本3 被干掉了 (虽然这里被干掉了,我们还是可以通过 git relog 的方式找到版本3的Commit_id,再通过 git reset --hard commit_id 的方式进行恢复)
2. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
3. 在回滚这一操作上看,效果差不多。但是在日后继续合并(merge)以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。