不小心合并了错误的分支,如何修复Git主分支? [英] How to fix a Git master branch after accidently merging the wrong branch?

查看:20
本文介绍了不小心合并了错误的分支,如何修复Git主分支?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个开发分支,在它准备好之前,我意外地合并到了主分支中。

因为我这样做是错误的,所以我决定恢复Master中的更改,这样我的更改就不在那里了。此进程创建了一个还原提交,从主服务器中删除了我的更改。

我觉得一切都很好...

现在已经过去了一周,我几乎准备好将我的分支合并回Master。由于还有其他开发人员在其他分支上工作,我决定通过将Master中的任何新更改合并回我的分支来更新我的Development分支。

此进程似乎会删除我的所有工作。

回顾刚刚来自Master的历史,它包含意外提交和恢复提交。这意味着每当我从Master更新我的分支时,还原提交都会删除我的大部分工作。

如何将主服务器中的更改合并回我的分支,但不包括还原提交?

我能想到的只有两种可能性:

  • 仔细检查合并中的每个项目,并尝试手动删除还原的项目(我认为这是不可能正确完成的,要正确完成完全是一场噩梦)。
  • 将我所做更改的所有文件复制到本地,从Master合并,然后尝试将所有更改复制/粘贴回我的分支(这可能也是正确的噩梦)。

我希望有更好的自动化方法来完成此操作(我希望进行某种类型的合并,但忽略某些提交过程)。

推荐答案

因此,您的情况是这样(时间从左向右流动):

--o--o--o---M--R--o   <- master
          /
    A--B--C--D--E     <- devel

您已将提交A、B和C合并到主服务器中,然后恢复了R中的更改,R是A+B+C的反转。

当您合并两个分支时(合并到哪个分支并不重要),您将从两边获得自上一个公共祖先以来的所有内容。

在这种情况下,共同的祖先是C,所以你得到了R、D和E。从Devel的角度来看,这看起来像是A、B和C被还原了,但从师父的角度看,似乎只发生了D和E。

解决方案1:还原

您可以恢复主分支或从主分支派生的辅助分支上的R。然后将它们合并:

--o--o--o---M--R--o   <- master
          /    
    A--B--C      R'   <- aux (git revert R)
                 
            D--E---M' <- devel

现在您可以将Devel合并到Master。

解决方案2:调整分支机构的基础

使用git rebase --force-rebase使用git rebase --force-rebase

使用新提交重新构建开发分支
--o--o--o---M--R--o   <- master
  |       /
  | A--B--C--D--E     <- (abandoned)
           
    A'-B'-C'-D'-E'    <- devel

现在您可以将Devel合并到Master。

解决方案3:隐藏不需要的公共祖先(仅限专家)

您临时构建此历史记录:

--o--o--o---M--R--o   <- master
           
    A--B--C--D--E     <- devel

安装移植物:

git replace --graft M M^

这告诉Git提交M只有一个父级M^。现在您可以将Devel合并到Master。

最后,恢复实际历史记录:

git replace --delete M

[编辑:使用git replace而不是过时的移植文件。]

这篇关于不小心合并了错误的分支,如何修复Git主分支?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆