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

Posted

技术标签:

【中文标题】如何围绕失败的合并分叉两个git分支【英文标题】:How to fork two git branches around failed merge 【发布时间】: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 处合并。

【问题讨论】:

【参考方案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 --/

【讨论】:

以上是关于如何围绕失败的合并分叉两个git分支的主要内容,如果未能解决你的问题,请参考以下文章

Git rebase使用

git:如何从远程分支获取并合并到本地分支?

git如何合并两个分支代码

Git的branch操作详解

如何在 Git 中合并两个分支(主分支和演示分支)代码 [重复]

git分支的创建与合并