1. git log (找到你想要回退的版本id,将它复制下来)git
2. git reset --hard 版本id (本地回退到目标版本)gitlab
3.git push --force (推送到远程仓库,实现回退)fetch
1. git log (找到你想要删除的版本id,将它复制下来)3d
2. git revert 版本id (本地回退到目标版本)blog
3.git push --force (推送到远程仓库,实现回退)it
reset与revert最大的区别在于:revert是新提交一个commit来撤回代码,而reset只是回到某个版本的代码commit原理
虽然二者都能回退到你想要的代码,可是对于远程仓库,当使用reset回退,其余同事的代码pull release拉最新代码,拉取到的结果并不会回退你的代码,由于pull是fetch与merge的结果,对于已有的commit进行merge是没有效果的。request
而revert是新的commit,此时merge新的commit就能回退到你的代码im
git branch backupd3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
提测的代码(已合入release),决定暂时不上生产,须要回退远程仓库的代码
举例以下:B与D的代码须要回退,A为线上版本,C为其余同事提交的代码
对一个文件新增b,c,d的三个修改,分别提交
目标是回退BD剩下AC
直接从最新的版本修改代码,修改到咱们想要版本,而后再提交上去,也就是手工回退。在这个例子中就是直接删除‘bd’后提交
手工改代码很容易出错
(1) 没有回退全部须要回退的代码
(2) 删除了不须要回退的代码
存在问题:
(1) 须要回退的代码夹杂了其余同事的commit,直接reset会把其余同事的代码也删除掉
(2) 远程仓库后退后,须要其余同事未回退的同事手动reset它们的本地仓库,不然其余同事提交会把删除的代码再次提交上去
与2.2 reset类似:
从要删除的版本的前一个版本拉一个拷贝分支,而后在远程仓库删掉release分支,再将拷贝分支推到远程release。
存在问题:须要让其余同事(本地版本领先于回退后的远程仓库版本)重拉项目或回退
Revert做用是消除一个commit,它的原理是新建一个commit反向修改目标commit
Revert与reset最主要的区别:revert是去除一个commit,reset是回到某个版本
对于此场景适用revert,咱们只要把B与D的提交revert掉,就能达到目的
Revert实现的回退,不须要其余同事重拉项目或者手动回退项目
须要注意的是在gitlab上revert,必须是无冲突的时候才成功,在此场景下有冲突就失败了
(1) 回到某个版本,使用reset;消除某个commit,使用revert
(2) 使用git reset实现回退到某个版本,须要让其余同事也回退或者重拉项目
(3) Revert有可能要手动处理冲突,reset没有这个问题
(4) 对release分支使用git push –force(强制推送)有风险,应该进行备份;或者对本身的分支进行revert,而后提merge request合并到release
(5) 若是没有revert冲突,建议在gitlab上执行revert