小A同学由于操作失误,把分支master合并到了当前的develope分支,并在此基础上,继续提交了几次代码,直到发现问题。
图片描述
那怎么去掉中间的标记4的merge,且保留后面的1和2的提交呢?

解决办法

一般的回退代码有下面3种方式
reset命令有3种方式:

1:git reset –mixed:此为默认方式,不带任何参数的git
reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index
file一级。如果还要提交,直接commit即可

3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

显然这些方式并不适合这种情况,这些方式是回退到以前的某个版本,而标记4是merge操作,涉及到多个文件,回退到此处会涉及到更多的文件修改,容易出错。
还有一种方式:git revert commitID
这种方式可以去掉中间的某次提交,而作为一次新的提交,来提交到当前的HEAD,但merge的操作依然不能使用此命令,会报错。
于是我想到了cherry-pick命令。
操作步骤:
1.当前分支git reset --hard 到标记3;
2.在当前提交处新切一个分支git checkout -b newBranch;
3.git cherry-pick 标记2;
4.git cherry-pick 标记3;

思路就是绕过了merge操作,然后把merge后的提交的再pick过来。注意的是check-pick标记2和标记3处的代码后需要再检查一遍,毕竟是涉及到merge后的改动,还好小A同学改动到merge涉及的代码。


aishuishui2066
281 声望7 粉丝