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

时间:2019-01-22 11:45:31

标签: git merge git-merge branching-and-merging merge-conflict-resolution

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

由于我这样做有误,所以我决定还原Master中的更改,以使我的所有更改均不存在。此过程创建了一个“还原提交”,从我的母版中删除了我的更改。

我认为一切都很好...

一个星期过去了,我几乎准备好将分支合并回Master。由于其他分支机构也有其他开发人员在工作,因此我决定通过将Master的所有新变更合并回我的矿山来更新自己的Development分支。

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

回顾一下Master刚刚发生的事情的历史,它包含意外的提交和还原的提交。这意味着每当我从Master更新分支时,还原提交都会删除我的大部分工作。

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

我能想到的仅有的两种可能性是:

  • 仔细检查合并中的所有项目,然后尝试手动删除还原的项目(我认为这将无法正确完成,而整个噩梦也无法解决)。
  • 将我已进行更改的所有文件复制到本地,从Master合并,然后尝试将所有更改复制/粘贴回我的分支中(这可能也是正确的噩梦)。

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

2 个答案:

答案 0 :(得分:3)

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

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

您已将提交A,B和C合并到master中,然后还原了R中的更改,R是A + B + C的反函数。

合并两个分支时(合并到哪个分支都没有关系),自最后一个共同祖先起,您将从双方获得一切。

在这种情况下,公共祖先是C,因此得到R,D和E。从devel的角度来看,这看起来像是A,B和C已还原,但从master的角度来看,是好像只有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用新的提交重建devel分支:

--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代替不推荐使用的嫁接文件。]

答案 1 :(得分:0)

您可以尝试git reset --soft保留所有本地更改,然后将其推送到主版本吗?