(一)退回到某个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