代码之家  ›  专栏  ›  技术社区  ›  ali

如何围绕失败的合并分叉两个git分支

  •  1
  • ali  · 技术社区  · 12 年前

    目前,我的git存储库中存在以下情况。

    HEAD -- 0 -- 1 -- ... -- 3 -- 5 master
             \-- 2 -- ... -- 4 --/  branch-1
    

    分支“branch-1”在一段时间前已经从master分支出来(请参见提交5)。

    在提交0时,我想将其合并回master,但在提交1和3之间在master中发生的所有更改都被覆盖了。有效地创建

    0 -- 2 -- ... -- 4 -- 5 master
    

    由于我的同事无法继续他们在这种状态下的工作,我已经恢复了合并提交。因此,我确实将HEAD设置为与1相同。使用的命令是“git revert-m 2 0”。

    但现在我希望我的更改再次合并。这次我希望它能成功。我需要创建以下内容:

    -2 -- HEAD -- 0 -- 1 -- ... -- 3 -- 5 master
      \            \-- 2 -- ... -- 4 --/
       \--- -1 ------/
    

    这将是一个新的提交-1,它避免了失败的合并0,并返回到合并前的干净状态(我通过恢复实现的干净状态)。

    然而,仅仅试图将2合并到HEAD是行不通的。我认为这是因为它们已经在0处合并。

    1 回复  |  直到 12 年前
        1
  •  1
  •   functionpointer    12 年前

    问题是你使用了 git revert 而不是 git reset --HARD . 数字还原 创建一个新的提交,该提交将重做上一次提交的更改。 git reset 做同样的事情,但不是通过创建一个新的提交,而是通过丢弃错误的提交。正因为如此,错误的提交仍然存在于你的历史中。

    将2合并到HEAD不起作用,因为您正试图与自己的历史合并。这就像试图将4合并为2。

    你需要做的是,扔掉0,重新创建一个。

    首先,使用以下方法将master重置回1:

    git reset --HARD 1
    

    然后,在那里达到一个干净的、准备合并的状态(如果需要,可以进行提交)。

    之后,确保分支1指向2:

    git checkout branch-1
    git reset --HARD 2
    

    在那里也达到了一个干净的、准备合并的状态。 然后,将两者合并:

    git checkout master
    git merge branch-1
    

    检查合并的结果。如果它没有按你想要的那样工作,请重新设置master和branch-1。如果你不能让合并工作,你也可以尝试重新建立基础。这将使您的历史变平为这样的样子:

    2' -- .. -- 4' -- 1 -- .. -- 3 -- 5
    

    将两个分支合并或重新建立基础后,可以重新建立在恢复提交后引入的任何更改的基础(替换 2' 对于您创建的新merge/rebase的最新提交,不要使用HEAD,因为一旦命令运行,它就会改变):

    git rebase 2' -2
    

    在那之后,你的历史应该是这样的:

    -2' -- .. -- 2' -- .. -- 4' -- 1 -- .. -- 3 -- 5
    

    或者,如果您合并而不是重新合并:

    -2' -- .. -- 0' -- 1 -- ... -- 3 -- 5
                  \ -- 2 -- ... -- 4 --/
    
    推荐文章