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