(一)退回到某个commit -- reset
1. git log (找到你想要回退的版本id,将它复制下来)
2. git reset --hard 版本id (本地回退到目标版本)
3.git push --force (推送到远程仓库,实现回退)
(二)只想让以前某个commit的代码回退,而在它之后的代码都不回退 -- revert
1. git log (找到你想要删除的版本id,将它复制下来)
2. git revert 版本id (本地回退到目标版本)
3.git push --force (推送到远程仓库,实现回退)
(三)推荐使用revert进行远程仓库回退
reset与revert最大的区别在于:revert是新提交一个commit来撤回代码,而reset只是回到某个版本的代码commit
虽然两者都能回退到你想要的代码,但是对于远程仓库,当使用reset回退,其他同事的代码pull release拉最新代码,拉取到的结果并不会回退你的代码,因为pull是fetch与merge的结果,对于已有的commit进行merge是没有效果的。
而revert是新的commit,此时merge新的commit就能回退到你的代码
(四)进行远程分支push --force时需要进行备份再push
git branch backup
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
场景
提测的代码(已合入release),决定暂时不上生产,需要回退远程仓库的代码
举例如下:B与D的代码需要回退,A为线上版本,C为其他同事提交的代码
对一个文件新增b,c,d的三个修改,分别提交
目标是回退BD剩下AC
回退远程仓库代码的五种途径
2.1 手工修改最新版本代码
直接从最新的版本修改代码,修改到我们想要版本,然后再提交上去,也就是手工回退。在这个例子中就是直接删除‘bd’后提交
手工改代码很容易出错
(1) 没有回退所有需要回退的代码
(2) 删除了不需要回退的代码
2.2 本地仓库reset后强推到远程仓库,其他同事需手动reset
存在问题:
(1) 需要回退的代码夹杂了其他同事的commit,直接reset会把其他同事的代码也删除掉
(2) 远程仓库后退后,需要其他同事未回退的同事手动reset它们的本地仓库,否则其他同事提交会把删除的代码再次提交上去
2.3 拷贝release,远程仓库删除release分支后再覆盖
与2.2 reset相似:
从要删除的版本的前一个版本拉一个拷贝分支,然后在远程仓库删掉release分支,再将拷贝分支推到远程release。
存在问题:需要让其他同事(本地版本领先于回退后的远程仓库版本)重拉项目或回退
2.4本地仓库revert后强推到远程仓库
Revert作用是消除一个commit,它的原理是新建一个commit反向修改目标commit
Revert与reset最主要的区别:revert是去除一个commit,reset是回到某个版本
对于此场景适用revert,我们只要把B与D的提交revert掉,就能达到目的
Revert实现的回退,不需要其他同事重拉项目或者手动回退项目
2.5 在gitlab上执行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