git把测试分支误合并到开发分支后的回滚操作
场景:正常开发流程,我们会从master分支上拉一个新分支作为开发分支进行开发,但是在开发过程中有伙伴把测试分支合并到了开发分支,最后如果把开发分支合并回master分支的话,master分支会多了测试分支的代码,这些代码可能在其他开发模块还没上线,可能会导致生产环境出现异常,那么,如何从开发分支撤销掉从测试分支合并过来的代码呢?
分支如下图
思路:如上图,先在dev4上撤销commit回滚到dev3上,然后把回滚的代码放到贮存区,再撤销dev3这个commit,并且不要dev3的代码(因为dev3的代码是从test分支合并过来的),这时候dev的分支回到了dev2,再把贮存区的代码还原回来(即dev4的代码),再作为一个新的开发分支推送到远程分支,然后这个就是没有了测试分支的代码的开发分支
具体的操作验证
1.查看日志,记录需还原的commit版本号, git log --pretty=oneline
git log --pretty =oneline
2.撤销已提交的commit,回滚到测试分支误合并到开发分支的commit版本
git reset --mixed 回滚版本号
3.再次使用git log可以看到当前HEAD指向了测试分支误合并到开发分支的commit版本
这时候我们的代码区多了很多未暂存的文件
4.把撤销的代码文件暂存起来
git stash save ‘保存撤销的代码’
5.再撤销当前commit并且不保留代码(因为这里的代码是测试分支的,我们不需要这些代码)
git reset --hard HEAD^
6.把贮存区的代码重新应用出来
git stash list
git stash apply stash@{0}
7.这时候千万别pull代码,如果pull的话,HEAD指针又会指向远程的dev上最新的commit上,又会自动把测试分支的代码合并回来,直接把这个分支作为新的开发分支推送到远程仓库即可,然后用这个分支作为开发分支开发,最后把这个分支的代码合并回master分支,这时候就去掉了原来dev分支误合并的测试分支代码了,如图
8.此时可选择在新建分支后将代码推送到远程,用这个新分支代替原分支进行开发,或选择删除当前远程分支把当前分支提交到远程如下:
①删除当前分支的远程分支
$ git push origin :currentBranch
$ //或者这么写git push origin --delete currentBranch
②把当前分支提交到远程
$ git push origin currentBranch
注:
1.撤销上次的commit :HEAD~1或者HEAD^
2.git reset --mixed HEAD^
3.git reset --soft HEAD^
4.git reset --hard HEAD^
5.执行完git reset --mixed HEAD^命令后在idea可以看到已经撤销了刚刚的commit,文件又变回未提交的蓝色了
6.mixed 相当于代码保留,撤销git commit,同时撤销git add,代码回到未暂存区
7.soft相当于代码保留,撤销git commit ,不撤销git add,代码回到暂存区
8.hard不保留代码,撤销git commit,同时撤销git add,回到了上一次commit的状态
9. git relog 查看历史操作
还有一种常见的场景,本来在开发分支进行开发,然后切换到测试环境,合并了代码,但是这时候忘了切回开发分支,在测试分支提交了代码,这就导致开发分支少了这次提交的代码
处理方式一
记录自己操作过的代码,切换到开发分支,手动把代码补充完整,最笨的方法
处理方式二
在测试分支撤销掉当前提交的commit(git reset --mixed HEAD^),当然远程的测试分支并没有撤销,然后切回开发分支,把刚撤销的代码在开发分支重新提交一次即可,最后再开发分支合并到测试分支也不会有任何问题,因为修改的代码文件是一样的
————————————————