前几天我做了合并:
git checkout A
git merge B
git checkout B
git merge --no-ff A
git push origin B
之后,我意识到分支A
已成功合并到分支B
中。
但当我切换回分支A
时,我意识到分支B
也已合并到分支A
中。
为什么会这样?
答案 0 :(得分:1)
我们来看看。
您有两个分支A
和B
,合并它们会产生冲突。这可能看起来像这样:
*---*---*---* [A]
\
*---* [B]
您在GitHub上创建拉取请求,以将B
合并到A
(或A
合并到B
,在这种情况下,这并不重要)。 GitHub告诉您合并产生必须解决的冲突,因此无法自动完成。
按照GitHub的说明,您可以在本地运行以下命令:
git checkout A
git merge B
现在您的本地副本看起来像这样:
*---*---*---*---x [A]
\ /
*-------* [B]
此处x
是一项新的提交,可解决A
和B
之间的冲突。然后运行以下命令:
git checkout B
git merge --no-ff A
由于x
是B
中尚未包含的新提交(特别是因为您已包含--no-ff
),因此会生成新的提交y
:
*---*---*---*---x [A]
\ / \
*-------*---y [B]
在不创建此“循环合并”的情况下解决冲突的另一个选项是将B
重新绑定到A
并以这种方式解决冲突:
git checkout B
git rebase A
这会产生类似
的内容*---*---*---* [A]
\
o---o [B]
标记为B
的{{1}}中的两个最新提交是新的(他们的哈希值已更改),因此您必须使用o
强制将B
推回GitHub ,但现在您可以使用GitHub的拉取请求UI完成合并,而无需创建“循环合并”。
在执行此操作之前,请务必先阅读implications of rewriting commits并强制推送(--force-with-lease
此处),尤其是在团队合作的情况下。