为什么会出现git merge冲突?

时间:2019-04-10 18:36:40

标签: git merge-conflict-resolution git-merge-conflict

我遇到了我不了解的与git和Bitbucket有关的情况。

我创建了一个分支branchB,该分支起源于master。我进行了一些提交,并向master创建了请求请求。在审核请求请求的同时,我开始研究另一个功能,该功能是branchB的功能的扩展。因此,我创建了另一个源自branchC的分支(branchB)。准备好扩展功能后,我向branchB创建了一个拉取请求。请参见图片I 。当时我没有任何合并冲突。

enter image description here

我希望允许审阅者分别查看两个请求,并分别进行较小的更改。

我的计划如下:

  • 使用PR1选项合并拉取请求1(--squash)进行掌握
  • 将拉取请求2(PR2)中的目标分支更改为master(请参见图片2
  • 将拉取请求2(PR2)合并到主域

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

所以我解决了冲突:

  1. PR2

  2. git checkout master

  3. git pull

  4. git checkout branchC

  5. git rebase master

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

  7. git mergetool

实际上,我遇到过两次描述的问题,因为我也有git rebase --continue源自branchD。当我将branchC合并到branchB中时,我必须在步骤6中解决一些冲突。但是,当我将master合并到branchC中时,我不必解决在步骤6中手动进行任何冲突(即使Bitbucket向我显示了合并冲突,因此我也必须重新设置master的基准)。

Mu问题如下:

  1. 为什么当我使用branchC选项将PR2合并为master时,Bitbucket为什么会显示PR1的任何合并冲突?我希望它能解决这个问题图片--squashI之间的更改仅在提交ID中进行-代码未更改。 Git / Butbucket应该能够弄清楚我要进行哪些更改。
  2. 当我将II合并到branchD(在将master合并到branch C之后,为什么没有得到应该手动解决的冲突) ?因为Bitbucket无法合并我的请求请求,所以我希望我需要手动解决一些冲突。它可以与我的台式机和Bitbucket上的git版本相关吗?
  3. 我是否比在我的情况下创建这三个拉取请求更好的选择?我可以避免这些合并冲突吗?

其他信息:

    我台式机上的
  • git版本:master
  • Bitbucket版本:2.17.1.windows.2
  • Bitbucket服务器上的
  • git版本:v5.12.2
  • 我在寻找类似的问题(123)。他们都没有解决我的问题。

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

编辑: 1.我使用2.14.5选项合并了所有拉取请求。 2.我更新了图片,以显示--squashbranchB分别不是以提交branchCB1开始。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的情况。问题是这个--squash。这是说明如何在GIT How does git know which version of a line to keep?中进行合并的主题。

当您与--squash合并时,由于git commit实际上是不可变的,因此您创建了一个具有新ID的新压缩提交。当您想将PR2合并回主文件时,两个位置的文件内容均已更改。对于branchB,有许多带有某些ID的提交,对于master,只有一个具有不同ID的提交,并且两个分支上的某些文件均已更改,因此git根本不知道哪个版本是正确。这就是为什么在branchC时没有冲突的原因,因为branchBbranchC的提交历史是相同的(此处没有--squash)。