![3b4d357223a9b92782264a4fa3f665ce.png](https://i-blog.csdnimg.cn/blog_migrate/790f72a9b7fffcf5a8c3215f74971945.jpeg)
很多情况下我们需要回滚代码,最容易想到的就是git reset。但是git reset有个弱点,它是一个彻底的回滚,不能再提交给远程了,因为在提交记录里回滚点之后的记录都不见了。
![53dc4a84197a0ff93e8043d0656df8e2.png](https://i-blog.csdnimg.cn/blog_migrate/e79f5f8ddb7dc74122e7bb471bddc651.jpeg)
做一下试验,一个文件我们提交了三次之后回滚
#往前回滚两次的提交
![a156f3673c8c640f841ef2466ee9dcf1.png](https://i-blog.csdnimg.cn/blog_migrate/bf867d5c6e277d1ee3b6fe226e5c794e.jpeg)
回滚完成之后用git log命令查看发现只有第一次提交的记录了,这个时候如果推送到远程,远程git库肯定是拒绝的,因为此时它已经拥有了第三次的提交,毕竟曾经沧海难为水。如果拥有force权限,也可以霸王硬上弓,使用
git push -f
来强制覆盖,但大多数情况下开发者没有权限同时也不推荐这么做。
这个时候git revert就要上场了。它和reset的区别在于,它会新生成一个提交,它的方向是向前,而git reset的方向是向后。
尝试往前回滚一个commit
git revert HEAD
会直接弹出编辑提交信息的vi,同时内容直接更新
![db03e96d63a74b7e8af567ca6a1f45e9.png](https://i-blog.csdnimg.cn/blog_migrate/4f5234a9499bf4598cde973175f73f2e.jpeg)
查看git log,可以看到多出来一个提交记录了
![b1d19412cfaaa24872a266e3f722fb08.png](https://i-blog.csdnimg.cn/blog_migrate/d8606d5b3df9584064fb65102ff792e5.jpeg)
也可以使用提交的hash,回到的是这个hash的提交之前的状态
git revert 64c0
![983b88e760ea2f508f3a03c76ff9818d.png](https://i-blog.csdnimg.cn/blog_migrate/b8efabbc5dda666c15b68f5a9b9e1b12.jpeg)
提示有冲突,其实就是根据之前的提交里的文件内容与当前的文件内容做了一次merge,当然就是有冲突了
![45233f8d7f58d29a1c59c6ad498c9fe2.png](https://i-blog.csdnimg.cn/blog_migrate/883fe246fe0b3cea4fbb2bb8f631fc81.jpeg)
解决冲突后即可提交,现在这个本地git推送给远程就不再会被拒绝了,最终终于实现了除却巫山不是云。