如何在VSTS的pull request中解决合并冲突?

75

我创建了一个拉取请求,但出现了以下情况:

enter image description here

“批准”按钮没有任何作用,且“完成”按钮被禁用。

我应该如何解决拉取请求中的冲突?

5个回答

67

更新

微软刚刚添加了基于浏览器的合并功能。这可能可以解决小冲突问题。

此外,它还提供了 更好的可视化方案(截至Sprint 150)

对于更复杂的情况:

您有两种解决冲突的选择,从目标分支反向集成更改(这会创建额外的合并提交),或在目标分支上进行rebase操作(这将保持您的历史记录干净整洁)。


在完成PR之前,从目标分支合并到当前分支。

您需要在本地克隆存储库,执行从目标分支到您的分支的合并,然后将这些更改推送到存储库。VSTS将检测到这些更改并更新拉取请求。

            -------o3              PR
           /
---------o1-o2                     target

因此将目标(o2)合并到PR中:

            -------o3-o4           PR
           /          /
---------o1----------o2            target

然后完成PR。

            -------o3-o4           PR
           /          / \
---------o1----------o2--o5        target

将PR分支变基,以包括目标分支上的最新更改

或者,您可以在本地克隆repo,将PR分支变基到目标分支的最新版本上,解决变基中出现的所有问题,并强制推送更改回PR分支。 VSTS将检测到更改并更新拉取请求。


            -------o3              PR
           /
---------o1-o2                     target
因此,将o3的变更基于o2进行重新定位:
              -------o3            PR
             /
---------o1-o2                     target

然后完成PR(在下面的情况下使用快进式合并):

---------o1-o2-o3                  target

1
你从哪里启动基于浏览器的合并?完成按钮被禁用了。 - RBT

35
  1. 用 Visual Studio 打开你的项目。
  2. 打开 视图 > 团队资源管理器
  3. 切换到 分支 选项卡。
  4. 双击要合并的分支(例如 dev)。
  5. 右键单击 > 合并来源 > 选择
    合并自分支: master,
    进入当前分支: dev
  6. 点击 合并 按钮
  7. 选择冲突文件
  8. 然后解决冲突。你可以点击左侧或右侧的复选框, 选择你想要包含的部分。
  9. 然后提交合并。
  10. 完成。

回答 @metabuddy 的问题:

然后呢?这只展示了如何在本地解决冲突,我无法直接将目标分支或源分支推送到 VSTS,因为我有分支策略需要从特征分支创建拉取请求。

你可以按照上述步骤操作,只是源分支和目标分支会稍有不同。

  1. 合并自分支: master
  2. 进入分支: 你的特征分支
  3. 创建拉取请求,将 你的特征分支 合并到 master 中。

10
那之后呢?这只是展示如何在本地解决冲突,我不能直接将目标分支或源分支推送到VSTS,因为我的分支策略要求必须从功能分支创建拉取请求。 - HamsterWithPitchfork
2
@metabuddy:回答的作者假设您正在将dev合并到master。如果您从功能分支中有拉取请求合并到dev,则可以在本地将dev合并到您的功能分支中,解决冲突并推送功能分支。 - Liero
如果我从我的功能分支向主分支提出拉取请求(在合并冲突之后),那么我将无法继续,因为这两个分支之间没有任何区别。这在某种程度上使拉取请求变得过时了。 - Christoph B
对于VS 2019,导航方式有些不同。一旦您选择了“dev”分支,然后右键单击“Master”,从上下文菜单中选择“合并到当前分支”选项。 - RBT

10

1
在按照链接中的步骤并到达“接受合并”阶段后,我没有看到任何合并提交。在这一点上,我该如何继续开发?在这个阶段,合并PR是我的唯一选择吗? - s g

0

经过一些失败的尝试,我找到了可行的解决方案,基于@Sailesh在合并开发分支和主分支问题中的回答:

首先将master合并到development中,这样如果有任何冲突,您可以在development分支本身解决。

(on branch development)$ git merge master

在此之后,您可以轻松地完成相反方向的 Pull Request,而不会出现任何问题


0

这个答案是针对@metabuddy在@sky91的回答中的评论而给出的。

如果您的目标分支是'master',并且在'master'分支上应用了不接受直接合并的策略,该怎么办?

注意:考虑'master'是目标分支,'x001'是拉取请求中的源分支,在'master'和'x001'分支之间存在冲突。

在这种情况下,@sky91的解决方案将无法使用。为此,您需要按照以下步骤操作。

  1. 从目标('master')分支创建一个新的分支,例如 'x002'
  2. 进入Visual Studio,并选择 'x002'
  3. 将 'x002' 从 'x001' 分支合并。
  4. 转到您的拉取请求并将目标分支更改为 'x002'
  5. 它将显示与您在拉取请求中拥有的相同冲突。
  6. 解决所有冲突并提交合并。
  7. 当您刷新拉取请求页面时,它将显示“更改已合并”
  8. 它必须显示“关闭”按钮。如果有,请关闭此拉取请求。
  9. 现在,您的所有更改都已合并并保存到 'x002'
  10. 从 'x002' 到 'master' 创建一个新的拉取请求
  11. 因为所有冲突都已消除,所以允许合并到 'master' 分支。

为什么不直接将主分支合并到X001分支,以解决冲突? - Liero
在某些情况下,这在我的案例中是不可能的。上述方法是最干净的方式。 - Haider Ali Wajihi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接