为什么会出现 git 合并冲突?

Why do I get git merge conflicts?

我遇到了与 git 和 Bitbucket 有关的情况,但我不明白。

我创建了一个源自 master 的分支 branchB。我做了一些提交并向 master 创建了一个拉取请求。在审查此拉取请求时,我开始研究另一个功能,它是 branchB 功能的扩展。所以我创建了另一个分支 (branchC),它起源于 branchB。当我的扩展功能准备就绪时,我向 branchB 创建了一个拉取请求。参见 图片 I。我当时没有任何合并冲突。

我想让审阅者分别查看两个 pull request,并有单独的 pull requests 和较小的更改。

我的计划如下:

但是,当我使用 --squash 选项将拉取请求 1 (PR1) 合并到 master 时,Bitbucket 自动更改了拉取请求 2 (PR2) 的目标分支到 master,我在拉取请求 2 (PR2) 中遇到了一些冲突。

所以我解决了冲突:

  1. git checkout master

  2. git pull

  3. git checkout branchC

  4. git rebase master

  5. git mergetool

  6. 我在这里解决了所有冲突。

  7. git rebase --continue

实际上,描述的问题在我身上发生了两次,因为我也有 branchD 来自 branchC。当我将branchB合并到master时,我必须解决步骤6中的一些冲突。但是当我将branchC合并到master时,我不必解决第 6 步中手动出现的任何冲突(尽管 Bitbucket 向我显示了合并冲突,所以我不得不变基 branchC)。

Mu 问题如下:

  1. 当我使用 --squash 选项将 PR1 合并到 master 时,为什么 Bitbucket 向我显示 PR2 的任何合并冲突? 我' d 希望它弄清楚图片 III 之间的变化仅在提交 ID 中——代码没有改变。 Git/Butbucket 应该能够弄清楚我要进行哪些更改。
  2. 为什么当我将 branchD 变基到 master 时(在我将 branch C 合并到 master)? 由于 Bitbucket 无法合并我的拉取请求,我希望我需要手动解决一些冲突。它可能与我的桌面和 Bitbucket 上的 git 版本有关吗?
  3. 我有没有比在我的案例中创建这三个拉取请求更好的选择?我可以避免这些合并冲突吗?

附加信息:

对于这种现象的任何解释,我将不胜感激。

编辑: 1. 我使用 --squash 选项合并了所有拉取请求。 2. 我更新了图片以显示 branchBbranchC 不分别以提交 B1C1 开头。

如果我正确理解你的情况。问题是这个 --squash。这是解释如何在 GIT How does git know which version of a line to keep?.

中完成合并的主题

当您与 --squash 合并时,由于 git 提交实际上是不可变的,您创建了一个具有新 ID 的新压缩提交。当您想将 PR2 合并回 master 时,两个地方的文件内容都已更改。对于 branchB 有许多带有一些 ID 的提交,对于 master 只有一个具有不同 ID 的提交并且两个分支上的一些文件都被更改了,所以基本上 git 没有知道哪个版本是正确的。这就是为什么在 branchC 的情况下没有冲突,因为 branchBbranchC 的提交历史是相同的(这里没有 --squash 完成)。