繁体   English   中英

为什么我会遇到 git 合并冲突?

[英]Why do I get git merge conflicts?

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

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

在此处输入图片说明

我想让审阅者分别查看两个拉取请求,并拥有具有较小更改的单独拉取请求。

我的计划如下:

  • 使用--squash选项将拉取请求 1 ( PR1 ) 合并到 master
  • 将 pull request 2 ( PR2 ) 中的目标分支更改为 master (见图2
  • 将拉取请求 2 ( PR2 ) 合并到 master

但是,当我使用--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 )。

穆问题如下:

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

附加信息:

  • 我桌面上的 git 版本: 2.17.1.windows.2
  • v5.12.2版本: v5.12.2
  • Bitbucket 服务器上的 git 版本: 2.14.5
  • 我寻找了类似的问题( 1 , 2 , 3 )。 他们都没有处理我的问题。

我很感激对这种现象的任何解释。

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

如果我理解你的情况正确。 问题是这个--squash 这是解释如何在 GIT 中完成合并的主题git 如何知道要保留哪个版本的行? .

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM