如何围绕失败的合并分叉两个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 --HARD
。 git 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分支的主要内容,如果未能解决你的问题,请参考以下文章