为什么会出现 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
- 将拉取请求 2 (
PR2
) 中的目标分支更改为 master (参见 图片 2)
- 将拉取请求 2 (
PR2
) 合并到 master
但是,当我使用 --squash
选项将拉取请求 1 (PR1
) 合并到 master 时,Bitbucket 自动更改了拉取请求 2 (PR2
) 的目标分支到 master
,我在拉取请求 2 (PR2
) 中遇到了一些冲突。
所以我解决了冲突:
git checkout master
git pull
git checkout branchC
git rebase master
git mergetool
我在这里解决了所有冲突。
git rebase --continue
实际上,描述的问题在我身上发生了两次,因为我也有 branchD
来自 branchC
。当我将branchB
合并到master
时,我必须解决步骤6中的一些冲突。但是当我将branchC
合并到master
时,我不必解决第 6 步中手动出现的任何冲突(尽管 Bitbucket 向我显示了合并冲突,所以我不得不变基 branchC
)。
Mu 问题如下:
- 当我使用
--squash
选项将 PR1
合并到 master 时,为什么 Bitbucket 向我显示 PR2
的任何合并冲突? 我' d 希望它弄清楚图片 I
和 II
之间的变化仅在提交 ID 中——代码没有改变。 Git/Butbucket 应该能够弄清楚我要进行哪些更改。
- 为什么当我将
branchD
变基到 master
时(在我将 branch C
合并到 master
)? 由于 Bitbucket 无法合并我的拉取请求,我希望我需要手动解决一些冲突。它可能与我的桌面和 Bitbucket 上的 git 版本有关吗?
- 我有没有比在我的案例中创建这三个拉取请求更好的选择?我可以避免这些合并冲突吗?
附加信息:
- git 我桌面上的版本:
2.17.1.windows.2
- Bitbucket 版本:
v5.12.2
- git Bitbucket 服务器上的版本:
2.14.5
- 我查找了类似的问题 (1, 2, 3)。 None 其中解决了我的问题。
对于这种现象的任何解释,我将不胜感激。
编辑:
1. 我使用 --squash
选项合并了所有拉取请求。
2. 我更新了图片以显示 branchB
和 branchC
不分别以提交 B1
和 C1
开头。
如果我正确理解你的情况。问题是这个 --squash
。这是解释如何在 GIT How does git know which version of a line to keep?.
中完成合并的主题
当您与 --squash
合并时,由于 git 提交实际上是不可变的,您创建了一个具有新 ID 的新压缩提交。当您想将 PR2
合并回 master 时,两个地方的文件内容都已更改。对于 branchB
有许多带有一些 ID 的提交,对于 master
只有一个具有不同 ID 的提交并且两个分支上的一些文件都被更改了,所以基本上 git 没有知道哪个版本是正确的。这就是为什么在 branchC
的情况下没有冲突,因为 branchB
和 branchC
的提交历史是相同的(这里没有 --squash
完成)。
我遇到了与 git 和 Bitbucket 有关的情况,但我不明白。
我创建了一个源自 master
的分支 branchB
。我做了一些提交并向 master
创建了一个拉取请求。在审查此拉取请求时,我开始研究另一个功能,它是 branchB
功能的扩展。所以我创建了另一个分支 (branchC
),它起源于 branchB
。当我的扩展功能准备就绪时,我向 branchB
创建了一个拉取请求。参见 图片 I。我当时没有任何合并冲突。
我想让审阅者分别查看两个 pull request,并有单独的 pull requests 和较小的更改。
我的计划如下:
- 使用
--squash
选项将拉取请求 1 (PR1
) 合并到 master - 将拉取请求 2 (
PR2
) 中的目标分支更改为 master (参见 图片 2) - 将拉取请求 2 (
PR2
) 合并到 master
但是,当我使用 --squash
选项将拉取请求 1 (PR1
) 合并到 master 时,Bitbucket 自动更改了拉取请求 2 (PR2
) 的目标分支到 master
,我在拉取请求 2 (PR2
) 中遇到了一些冲突。
所以我解决了冲突:
git checkout master
git pull
git checkout branchC
git rebase master
git mergetool
我在这里解决了所有冲突。
git rebase --continue
实际上,描述的问题在我身上发生了两次,因为我也有 branchD
来自 branchC
。当我将branchB
合并到master
时,我必须解决步骤6中的一些冲突。但是当我将branchC
合并到master
时,我不必解决第 6 步中手动出现的任何冲突(尽管 Bitbucket 向我显示了合并冲突,所以我不得不变基 branchC
)。
Mu 问题如下:
- 当我使用
--squash
选项将PR1
合并到 master 时,为什么 Bitbucket 向我显示PR2
的任何合并冲突? 我' d 希望它弄清楚图片I
和II
之间的变化仅在提交 ID 中——代码没有改变。 Git/Butbucket 应该能够弄清楚我要进行哪些更改。 - 为什么当我将
branchD
变基到master
时(在我将branch C
合并到master
)? 由于 Bitbucket 无法合并我的拉取请求,我希望我需要手动解决一些冲突。它可能与我的桌面和 Bitbucket 上的 git 版本有关吗? - 我有没有比在我的案例中创建这三个拉取请求更好的选择?我可以避免这些合并冲突吗?
附加信息:
- git 我桌面上的版本:
2.17.1.windows.2
- Bitbucket 版本:
v5.12.2
- git Bitbucket 服务器上的版本:
2.14.5
- 我查找了类似的问题 (1, 2, 3)。 None 其中解决了我的问题。
对于这种现象的任何解释,我将不胜感激。
编辑:
1. 我使用 --squash
选项合并了所有拉取请求。
2. 我更新了图片以显示 branchB
和 branchC
不分别以提交 B1
和 C1
开头。
如果我正确理解你的情况。问题是这个 --squash
。这是解释如何在 GIT How does git know which version of a line to keep?.
当您与 --squash
合并时,由于 git 提交实际上是不可变的,您创建了一个具有新 ID 的新压缩提交。当您想将 PR2
合并回 master 时,两个地方的文件内容都已更改。对于 branchB
有许多带有一些 ID 的提交,对于 master
只有一个具有不同 ID 的提交并且两个分支上的一些文件都被更改了,所以基本上 git 没有知道哪个版本是正确的。这就是为什么在 branchC
的情况下没有冲突,因为 branchB
和 branchC
的提交历史是相同的(这里没有 --squash
完成)。