Git revert 某次merge后再重新 merge代码,上次merge的内容被忽略

5,596 阅读2分钟

背景:我们在开发的时候常常需要把每天开发的内容合并到dev(防止代码丢失或者不可预期的电脑崩坏而造成前期工作白费),有时候因为自己的疏忽而合到了master或者重要的分支,之后进行revert操作再合并到正确的分支中。

1、revert操作:

  1. 选择产生新的提交记录,生成新的merge记录(**这时候就有两个revert操作的记录) **。
  2. 选择不产生新的提交记录,直接撤回

2、第二次merget操作(上线)

     在开发测试阶段都完成后,进行上线环节,那么我们就要把代码合并到master了,这时你会发现少了很多提交记录。

     为什么呢? (因为你第一次merge的时候会产生已提交记录,那在revert操作的时候并不会清除这些记录,只是进行了撤回操作)

3、解决办法:

  1. 当你revert操作的时候,在本地master分支拉取代码,进行回退操作到mert之前的提交记录,再强制覆盖远程分支。(merge之后revert之前:要保证没有其他同事进行拉取的操作,不然会造成分支污染,一定要做让同事先回退再拉取

  2. revert操作后,第二次merge操作的时候,已经有大量的其他同事提交记录

    1. 强制物理覆盖重新提交一次(暴力解决

      1. 从master拉个新分支出来,物理拷贝需要上线的那个分支代码后提交, master再merge此分支
    2. master 分支reset 后 pull -f(适用于非master分支)

      1. 注意:一般master分支都有protect ,不让回滚提交,要去gitlab上关闭此保护

      2. git reset head^ --hard : head^表示回滚到上一个提交版本 --head 本地代码会被覆盖

        git checkout master 
        # 把master回滚merge之前的状态 
        git reset head^ --hard   (或 git reset --head "<>") 
        # 强制推上去 
        git push -f 
        # 重新merge feature(上次merge的分支)后再推远程即可 
        git merge feature(上次merge的分支) 
        git push
        
        
    3. 官方推荐方法:(官方推荐)(已实践)

      1. 情况1(与上面的标题1内容一一对应):
      2. 情况2(与上面的标题1内容一一对应):
        #拉新分支解决 git checkout master 
        # 从master拉一个新分支 DHR-1778 
            git checkout -b DHR-1778 
        # 找到 revert 的那条提交记录, 
        #注意: 
          # 情况1:revert会有两条记录,第一条是 revert,第二条是 revert 后 merge 的记录,这里取第一条 
          # 情况2:只有一条记录,直接用 
        # 用DHR-1778分支revert之前的revert 
            git revert <版本号> 
        # 再用master分支合并此分支代码推到远程即可(DHR-1778合并到master操作) 
            git checkout master 
            git merge DHR-1778 
            git push 
        #不拉新分支解决,直接在master 上revert 之前revert的分支即可(不用新拉分支), 但是注意解决好冲突(拉新分支是保险起见)