【问题标题】:How to fork two git branches around failed merge如何围绕失败的合并分叉两个git分支
【发布时间】:2013-09-10 11:33:23
【问题描述】:

我的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 处合并。

【问题讨论】:

    标签: git merge git-merge revert git-revert


    【解决方案1】:

    问题在于您使用了git revert 而不是git reset --HARDgit revert 创建一个新的提交,重做之前提交的更改。 git reset 做同样的事情,但不是通过创建新的提交,而是通过丢弃错误的提交。因此,错误的提交仍然存在于您的历史记录中。

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

    你需要做的是,扔掉 0 并做一个新的。

    首先,使用以下命令将 master 重置回 1:

    git reset --HARD 1
    

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

    之后,确保 branch-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' 替换为您创建的新合并/重新设置的最新提交,不要使用 HEAD,因为它会命令运行后更改):

    git rebase 2' -2
    

    之后,您的历史记录应如下所示:

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

    或者,如果你合并而不是变基:

    -2' -- .. -- 0' -- 1 -- ... -- 3 -- 5
                  \ -- 2 -- ... -- 4 --/
    

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 1970-01-01
      • 2021-01-18
      • 2011-08-11
      • 1970-01-01
      • 2014-09-23
      • 2013-05-23
      • 2013-04-11
      • 2011-02-17
      相关资源
      最近更新 更多