首页 > 解决方案 > 意外合并错误分支后如何修复 Git 主分支?

问题描述

我有一个开发分支,在它准备好之前我不小心合并到了主分支中。

由于我错误地执行了此操作,因此我决定还原 Master 中的更改,这样我的更改就不会出现在那里。这个过程创建了一个 Revert Commit,它从 Master 中删除了我的更改。

一切都很好,我以为...

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

这个过程似乎删除了我所有的工作。

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

如何将 master 中的更改合并回我的分支,但不包括恢复提交?

我能想到的唯一两种可能性是:

我希望有一种更好的自动化方式来做到这一点(我希望某种合并但忽略某些提交过程)。

标签: gitmergegit-mergebranching-and-mergingmerge-conflict-resolution

解决方案


所以,你的情况是这样的(时间从左到右流动):

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

您已将提交 A、B 和 C 合并到 master 中,然后恢复 R 中的更改,这是 A+B+C 的倒数。

当您合并两个分支时(无论您合并到哪个分支中都没有关系),您将从最后一个共同祖先以来的两侧获得所有内容。

在这种情况下,共同的祖先是C,所以你得到R,D和E。从开发人员的角度来看,这看起来像是A,B和C被还原了,但从主人的角度来看,它好像只有D和E发生了。

解决方案 1:还原还原

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

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

现在您可以将开发合并到master。

解决方案 2:重新定位您的分支

您使用以下命令使用新提交重建您的开发分支git rebase --force-rebase

--o--o--o---M--R--o   <- master
  |\       /
  | A--B--C--D--E     <- (abandoned)
   \        
    A'-B'-C'-D'-E'    <- devel

现在您可以将开发合并到master。

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

您临时构建此历史记录:

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

通过安装移植物来做到这一点:

git replace --graft M M^

这告诉 Git 提交M只有一个父级,M^. 现在您可以将开发合并到master。

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

git replace --delete M

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


推荐阅读