【问题标题】:My VSTS pull request shows diffs between two branches when none exist当不存在时,我的 VSTS 拉取请求显示两个分支之间的差异
【发布时间】:2018-02-01 13:32:47
【问题描述】:

我试图了解这里发生了什么,因为这让我很受挫。

假设我有两个长寿的分支。 () - Master[] - Develop。我的 repo 的当前状态如下所示:

() <-- Master \ \ []--[]--[] <--Develop

我介绍了一个 {} - hotfix master 分支,其中需要在 Master 和 Develop 中进行更改。

()--{} <-- Hotfix (needs to go into both Master & Develop) \ \ []--[]--[] <--Develop

我通过单独的 Pull Request 将修补程序合并到 Master 和 Develop 中。

   _ _ _ _ _
  /         \
 ()----{}---() <-- Master /w hotfix changes
   \    \_ _ _ _ _
    \             \
     []--[]--[]----[] <--Develop /w hotfix changes

此时我注意到 VSTS 的 pull request diffing UI 中有两点:

  • 如果我为 Master 或 Develop 中的修补程序创建另一个拉取请求(回想一下,两个长期存在的分支已经包含来自先前 PR 的修补程序更改),基于 Web 的差异 UI 仍然显示修补程序与 Master 或 Develop 之间的差异。
  • 如果我创建了一个将开发为 master 的拉取请求,它会显示修补程序中包含的更改的差异(但这些更改已经在 Master 和 Develop 中)。

这是怎么回事?

【问题讨论】:

    标签: git azure-devops


    【解决方案1】:

    重点是 VSTS 如何完成 PR 以进行快进合并

    假设有两个分支(branch1branch2)具有以下提交历史:

    …---A   branch1
         \
          B  branch2
    

    如果你默认将branch2合并到branch1中(快进),比如直接执行git merge branch2命令,branch1branch2将指向同一个提交B如下:

    …---A---B   branch1, branch2
    

    但是对于 VSTS,它完成了一个没有快进的 PR,如命令 git merge --no-ff。所以即使是快进合并,也会创建一个合并提交。

    因此,如果您创建一个 PR 以将 branch2 合并到 branch1(或使用命令 git merge branch2 --no-ff),则提交历史将为:

    …---A---C   branch1
         \ /
          B   branch2
    

    虽然如果您创建 PR 以在 VSTS 中将 branch1 合并回 branch2(实际上没有必要),但它允许您创建 PR,因为来自 branch1 的提交 C 不在 branch2 上.

    现在回到你的情况,原来的提交历史如下:

      H1  hotfix
     /
    M1    master
     \
      D1---D2---D3  develop
    

    当您第一次创建两个拉取请求以将hotfix 合并为masterhotfix 分别合并为develop 时,完成两个拉取请求后,提交历史如下所示:

    M1-------M2    master
     \      /
      \---H1----------   hotfix
       \              \
        D1---D2---D3---D4  develop
    

    因此,如果您创建另一个 PR 以将 master/develop 分支合并到 hotfix,VSTS 将允许您创建 PR,因为 master/develop 分支和 hotfix 分支指向不同提交。但实际上没有必要将更改合并回来。

    如果你创建一个 PR 将develop 分支合并到master 分支,它不仅显示提交D1D2D3 的差异,还显示提交M2 的差异和D4(即使它们包含来自hotfix 分支的相同更改),因为它们是不同的提交。

    顺便说一句:

    • 根据你的工作流程,master是主分支,所有作品都在develop分支上开发。准备就绪后,将develop 分支合并到master 分支中。
    • 对于错误修复,它确实需要从master 分支分支hotfix 分支。但是在修复hotfix分支的bug时,最好hotfix合并到develop分支,然后将develop分支合并到master分支。这可以使历史更加清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      相关资源
      最近更新 更多