“修改” 2合并提交

时间:2018-08-21 13:42:10

标签: git merge

想象一下,我需要将2个分支合并到当前分支中。我首先合并了第一个分支,因此创建了2个头的合并提交。现在,我已经合并了第二个分支,但尚未创建合并提交。

是否可以修改上一次合并提交,因此它将获得3个父母?

o [HEAD] Merge2
|\                 o Modified Merge1
o \ Merge1         | \
|\ \               |\ \
| o | A            | o | A
| | |              | | |
| | o B            | | o B
. . .              . . .
. . .     ==>      . . .
. . .              . . .
|/  |              |/  |
o  /               o  /
| /                | /
o                  o/
.                  .
.                  .
.                  .

1 个答案:

答案 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

现在,如果创建了临时标记,则可以将其删除。