意外合并错误分支后如何修复 Git master 分支?

pli*_*ngo 0 git merge git-merge branching-and-merging merge-conflict-resolution

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

由于我错误地执行了此操作,因此我决定恢复 Master 中的更改,以便我的任何更改都不会发生在那里。此过程创建了一个恢复提交,从主服务器中删除了我的更改。

一切都很好我以为...

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

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

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

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

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

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

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

j6t*_*j6t 6

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

--o--o--o---M--R--o   <- master
   \       /
    A--B--C--D--E     <- devel
Run Code Online (Sandbox Code Playgroud)

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

当您合并两个分支时(合并到哪个分支并不重要),您将获得自最后一个共同祖先以来双方的所有内容。

在这种情况下,共同祖先是 C,所以你得到 R、D 和 E。从 devel 的角度来看,这看起来像是 A、B 和 C 已被还原,但从 master 的角度来看,这似乎只是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
Run Code Online (Sandbox Code Playgroud)

现在您可以将 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
Run Code Online (Sandbox Code Playgroud)

现在您可以将 devel 合并到 master 中。

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

你暂时建立这个历史:

--o--o--o---M--R--o   <- master
   \        
    A--B--C--D--E     <- devel
Run Code Online (Sandbox Code Playgroud)

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

git replace --graft M M^
Run Code Online (Sandbox Code Playgroud)

这告诉 Git 提交M只有一个父项M^. 现在您可以将 devel 合并到 master 中。

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

git replace --delete M
Run Code Online (Sandbox Code Playgroud)

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