我们在开发的过程中经常会遇到错误的提交,有可能是我们写的某段代码错误,也有可能某个小伙伴合并错误,也有可能把其他的分支上的代码不小心写在了这个分支上面,总之工作中会有千奇百怪的错误。结合开发中实际经验给大家展示正确的回滚错误代码的方式。
1、全部撤销
git reset --hard
有时候我们拿到了一坨代码,对就是一坨代码,自己修改了好久发现,fuck!心中一万只羊驼跑过!尤其到后来,发现自己修改的代码更是一团糟糕!
这时,你狠狠的扇了自己一耳光,决定把自己的修改全部消除掉,可以执行git reset --hard 把你所有的修改撤销掉。一般情况下我不会这么做,我会新建立一个分支,git checkout v1 分支用于存放已经有的代码,然后 执行git push origin v1:v1 把的代码推送到远端进行备份,然后再执行git reset --hard 回滚本地的代码,继续修改,遇到有需要的部分,再切换到v1 分支copy,切回来粘贴(来回切换的话,对新手来说肯定会遇到问题,不卖关子了),对于git 来说 是不允许未提交就切换分支的,这样你就需要另外一个命令
2、入栈和出栈
git stash
当我们修改了代码,同时需要切换分支,可以执行git stash 把我们修改的代码压入栈中,再切换到其他分支查看对应的代码,然后切换回来,执行 git stash pop 把你修改的代码弹出来,继续修改。
如下图,我们修改了a.text文件,当我们切换分支的时候Git告诉我们需要我们提交我们的修改才可以切换分支。而我们又不想提交我们的修改,怎么办呢?我们执行git stash ,然后切换到v1分支。
我们查看完v1的代码之后,切换回master 分支(还记得这个命令么 git checkout -)。执行git stash pop 弹出我们修改的代码,继续挖坑。
3、基于某次提交的代码回退
git reset --hard commitid 我们可以根据我们某次的提交进行代码的回退
上图当中我们错误的提交了b.text文件,于是我们想回退我的代码,回到提交前的某次提交,我们可以执行git reset --hard bd6ae89cf91d8bc2c814f2cfecf8df9c45a69c0b 这样我们本地的代码就会回到以这个commitid为基础的情况,如下图,然后我们执行git push origin v6:v6 --forec把我们回退后的代码推送到远端,覆盖掉所有的内容,这样远端的这个分支里面的代码就会被我们本地分支版本控制取代掉,这种操作之后git的历史也无法恢复,慎用。我一般的用法是先切一个分支出来,例如v6-tmp然后推送到远端的服务器,再确认无误之后执行git push origin :v6-tmp删除远端的分支。
4、git revert
这个方法回滚代码不会删除你的提交,会把你的提交回滚然后再提交,这样就保存了你的修改
git revert HEAD 撤销前一次 commit
git revert HEAD^ 撤销前前一次 commit
git revert commit-id (撤销指定的版本,撤销也会作为一次提交进行保存)
git rever HEAD~1 (这个波浪号是tab上面的那个键的波浪号要按着shift才可以打出来)
上图是我执行了 git revert HEAD~1 之后代码回滚的记录,个体不仅仅回滚了我的代码,同时把回滚之后的内容进行了一次提交。
5、回滚单个文件的修改
git checkout commit id 文件路径,这个方法会把我们本地仓库的内容检出,然后覆盖我们的修改,这个我前面的文章已经讲过不在赘述。