想象一下,我需要将2个分支合并到当前分支中。我首先合并了第一个分支,因此创建了2个头的合并提交。现在,我已经合并了第二个分支,但尚未创建合并提交。
是否可以修改上一次合并提交,因此它将获得3个父母?
o [HEAD] Merge2
|\ o Modified Merge1
o \ Merge1 | \
|\ \ |\ \
| o | A | o | A
| | | | | |
| | o B | | o B
. . . . . .
. . . ==> . . .
. . . . . .
|/ | |/ |
o / o /
| / | /
o o/
. .
. .
. .
答案 0 :(得分:3)
与2个以上的父母(章鱼合并)一起犯案可能比值得付出的头痛更大。但是有很多方法可以从这里到达那里。
由于您处于本地合并工作的中间,因此我假设您尚未推送第一个合并。这意味着擦除它的历史记录重写可能不是什么大问题。所以您有一些选择。
如果两个合并都不冲突,则默认的章鱼合并策略可能会起作用。在这种情况下,您可以返回到初始状态。既然听起来您处于合并状态,那么就从
开始git merge --abort
然后撤消上一个合并
git reset --hard HEAD^
然后将章鱼合并
git merge A B
这种方法的问题是章鱼合并策略甚至不会尝试处理冲突。在这种情况下,您将分两步进行合并(如您所愿),然后可以手动创建最终的合并提交,用它替换两个“正常”的合并提交。
但是在这一点上,我要再说一遍,您确定要吗?尤其是在有解决冲突的情况下,似乎您会舍弃信息。
好吧,如果您选择继续进行下去,则有几种方法。这不一定是“最简单的”操作,但是它避免了使用管道命令:
继续进行第二次合并。然后,也许创建一个临时标签。 (如果您对reflog感到满意,则可能不需要此标记。)然后返回到合并前的状态。
git tag merge_goal
git reset --hard HEAD~2
接下来启动三父级合并,但是(1)使用“我们的”策略避免冲突,并且(2)不要提交,因为“我们的”策略不会产生您想要的合并结果。
git merge --no-commit -s ours A B
这将设置您为新提交创建所需的父级列表,但是您仍然需要正确获取内容。
git rm -r .
git checkout merge_goal -- .
git commit
现在,如果创建了临时标记,则可以将其删除。