如何在不弄乱分支拉取请求关系的情况下挑选提交?

时间:2019-04-26 14:49:17

标签: git azure-devops

选择樱桃提交会创建具有相同内容的新提交。如果我通过dev分支从test分支挑选到dev-to-test分支,那么我樱桃选择的提交将包含在来自dev分支的下一个请求中进入test分支,即使它们的内容已经添加到测试分支中。

例如:

分支中存在当前提交:

dev:  a-b-c-d-e-f
test: a-b-c

然后我选择并快速前进:

dev:         a-b-c-d-e-f
test:        a-b-c-g(content of e)-h(content of f)

然后将一个新的提交添加到dev中:

dev: a-b-c-d-e-f-i

我想实现三件事:

  1. 开发人员要测试的下一个提取请求,仅提取提交 d-i;
  2. 测试历史看起来像test: a-b-c-g-h-d-i;
  3. 能够跟踪测试与提交e-f的关系 通过历史。

我该如何实现?还是应该重组git工作流程以防止此类事情发生?

这是此问题的真实示例:

这里是拉取请求的设置,红色框中的提交已经被挑选到目标分支。

the official document

这是结果历史记录。橙色的是来自cherrypick的提交。红色为拉取请求的提交。红色提交没有相关联的更改,并且完全重复了橙色提交的消息。

Screenshot from Azure DevOps pull request setup dialogue.

以下是完成的PR请求的详细信息。它具有这两个提交,不应存在,因为pull请求不会应用这些提交描述的更改。

Screenshot from Visual Studio git branch history.

1 个答案:

答案 0 :(得分:1)

当前情况:

dev: a-b-c-d-e-f-i
test      \g-h

通常从开发人员发送PR进行测试,然后合并:

dev: a-b-c-d-e-f-i
test      \g-h----\j  # j = h+i

这是我合并后描述测试分支的方式

test: a-b-c-g-h-j
  • r(j) = r(h)+r(i),因为j是第一父级h和第二父级i的子级。
  • 从文件内容开始的
  • c(j) = c(d)+c(i)j代表文件内容状态,以使得与h的差异等于dc的差异+ if的差异,en bref,

现在许多git GUI软件决定以线性列表方式显示事物,通常以相反的时间顺序显示,例如

dev: a-b-c-d-e-f-----i
test      \------g-h--\j
 | 
 V   # visually merged down to
     a-b-c-d-e-f.g.h.i-j

此表示形式仅在视觉上是线性的,并不意味着这些提交是线性连接的。因此,您看到的是来自许多分支的线性提交列表,而不仅仅是示例中的test分支。 test自己的历史很好,只有g-h,没有e-f

如果您确实只希望显示一对g-he-f,那么,由于这是回购中所有分支的提交的列表,因此一对对中的一个需要从中消失回购。换句话说,您需要重写devtest分支的历史记录。

几个git命令可以resetrebasefilter-branch来重写。