git把测试分支误合并到开发分支后的回滚操作

场景:正常开发流程,我们会从master分支上拉一个新分支作为开发分支进行开发,但是在开发过程中有伙伴把测试分支合并到了开发分支,最后如果把开发分支合并回master分支的话,master分支会多了测试分支的代码,这些代码可能在其他开发模块还没上线,可能会导致生产环境出现异常,那么,如何从开发分支撤销掉从测试分支合并过来的代码呢?

分支如下图

git把测试分支误合并到开发分支后的回滚操作_第1张图片

思路:如上图,先在dev4上撤销commit回滚到dev3上,然后把回滚的代码放到贮存区,再撤销dev3这个commit,并且不要dev3的代码(因为dev3的代码是从test分支合并过来的),这时候dev的分支回到了dev2,再把贮存区的代码还原回来(即dev4的代码),再作为一个新的开发分支推送到远程分支,然后这个就是没有了测试分支的代码的开发分支
具体的操作验证

1.查看日志,记录需还原的commit版本号, git log --pretty=oneline
git log --pretty =oneline
git把测试分支误合并到开发分支后的回滚操作_第2张图片

  1. 撤销已提交的commit,回滚到测试分支误合并到开发分支的commit版本
    git reset --mixed 回滚版本号
    git把测试分支误合并到开发分支后的回滚操作_第3张图片
  2. 再次使用git log可以看到当前HEAD指向了测试分支误合并到开发分支的commit版本
    git把测试分支误合并到开发分支后的回滚操作_第4张图片
    这时候我们的代码区多了很多未暂存的文件
    git把测试分支误合并到开发分支后的回滚操作_第5张图片
  3. 把撤销的代码文件暂存起来
    git stash save ‘保存撤销的代码’
    git把测试分支误合并到开发分支后的回滚操作_第6张图片
  4. 再撤销当前commit并且不保留代码(因为这里的代码是测试分支的,我们不需要这些代码)
    git reset --hard HEAD^

git把测试分支误合并到开发分支后的回滚操作_第7张图片

  1. 把贮存区的代码重新应用出来
    git stash list
    git stash apply stash@{0}
    git把测试分支误合并到开发分支后的回滚操作_第8张图片
  2. 这时候千万别pull代码,如果pull的话,HEAD指针又会指向远程的dev上最新的commit上,又会自动把测试分支的代码合并回来,直接把这个分支作为新的开发分支推送到远程仓库即可,然后用这个分支作为开发分支开发,最后把这个分支的代码合并回master分支,这时候就去掉了原来dev分支误合并的测试分支代码了,如图
    git把测试分支误合并到开发分支后的回滚操作_第9张图片

注:
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^),当然远程的测试分支并没有撤销,然后切回开发分支,把刚撤销的代码在开发分支重新提交一次即可,最后再开发分支合并到测试分支也不会有任何问题,因为修改的代码文件是一样的

你可能感兴趣的:(Git,git回滚和合并的分支代码)