git - 当不存在时,我的 VSTS pull 请求显示两个分支之间的差异

标签 git azure-devops

我试图了解这里发生的事情,因为这让我绊倒了。

假设我有两个长寿的分支。 () - Master[] - Develop .我的 repo 的当前状态如下所示:
() <-- Master \ \ []--[]--[] <--Develop
我介绍一个{} - hotfix将 master 分支与需要进入 Master 和 Develop 的更改分开。
()--{} <-- Hotfix (needs to go into both Master & Develop) \ \ []--[]--[] <--Develop
我通过单独的 pull 请求将修补程序 merge 到 Master 和 Develop 中。

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

在这一点上,我注意到 VSTS 的 pull request diffing UI 中有两件事:
  • 如果我为 Master 或 Develop 中的修补程序创建另一个 pull 请求(回想一下,两个长期存在的分支已经包含来自先前 PR 的修补程序更改),基于 Web 的差异 UI 仍会显示修补程序与 Master 或 Develop 之间的差异。
  • 如果我为 develop 到 master 创建一个 pull request,它会显示修补程序中包含的更改的差异(但这些更改已经在 Master 和 Develop 中)。

  • 这里发生了什么?

    最佳答案

    要点是 VSTS 如何为快进 merge 完成 PR .

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

    …---A   branch1
         \
          B  branch2
    

    如果 merge branch2进入 branch1默认方式(快进),例如通过执行 git merge branch2直接命令,branch1branch2将指向相同的提交 B如下:
    …---A---B   branch1, branch2
    

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

    所以如果你创建一个 PR 来 merge branch2进入 branch1 (或使用命令 git merge branch2 --no-ff ),提交历史将是:
    …---A---C   branch1
         \ /
          B   branch2
    

    而如果你创建一个 PR 来 merge 回来 branch1进入 branch2在VSTS中(实际上这是不必要的),它允许您自提交C以来创建PR来自 branch1不在 branch2 .

    现在回到你的情况,提交历史原始如下:
      H1  hotfix
     /
    M1    master
     \
      D1---D2---D3  develop
    

    当您第一次创建要 merge 的两个 pull 请求时 hotfix进入 masterhotfix进入 develop分别,完成两个 pull 请求后,提交历史看起来像:
    M1-------M2    master
     \      /
      \---H1----------   hotfix
       \              \
        D1---D2---D3---D4  develop
    

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

    然后你创建一个 PR 来 merge develop分支到master分支,它不仅显示提交 D1 的差异, D2D3 ,但也显示差异提交 M2D4 (即使它们包含来自 hotfix 分支的相同更改),因为它们是不同的提交。

    顺便说一句:
  • 根据您的工作流程,master是主分支,所有作品开发于develop分支。准备好后, merge develop分支到master分支。
  • 对于错误修复,它确实需要分支 hotfix分支来自 master分支。但是当修复 hotfix 上的错误时分行,你最好 merge hotfix进入 develop分支,然后 merge develop分支到master分公司 .这样可以更清楚地了解历史。
  • 关于git - 当不存在时,我的 VSTS pull 请求显示两个分支之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48564003/

    相关文章:

    git - 通过 ssh 共享 git repo 的正确方法

    git log --full-diff,它有什么作用?

    azure-devops - 子和的 DAX 表达式

    azure-devops - 模板yaml可以使用父yaml的参数吗?

    azure-devops - 运行时 Cake Build 脚本中的 GitVersion 任务在 Azure DevOps 上缺少库

    git - 如何从不相关的项目中撤消 git pull?

    windows - gitstats在windows中使用gitstats报错的解决方法

    git - 使用 unison 同步包含 git 存储库的目录

    azure - 概述使用哪种 Azure 个人访问 token 的时间和频率?

    azure-devops - Azure DevOps 中的名称和显示名称有什么区别