如何樱桃挑选提交而不会搞乱分支拉动请求关系?

问题描述 投票:1回答:1

Cherry-picking提交会创建具有相同内容的新提交。如果我通过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. 从dev开始测试的下一个pull请求只接受提交d-i;
  2. 测试的历史看起来像test: a-b-c-g-h-d-i;
  3. 能够通过历史跟踪测试与提交e-f的关系。

我怎样才能做到这一点?或者我应该重组git工作流程以防止这样的事情发生?

以下是此问题的真实示例:

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

Screenshot from Azure DevOps pull request setup dialogue.

这是由此产生的历史。橙色是来自cherrypick的提交。红色是来自pull请求的提交。红色提交没有相关的更改,并且完全重复橙色提交的消息。

Screenshot from Visual Studio git branch history.

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

History from Azure DevOps completed pull request.

git azure-devops
1个回答
1
投票

现在的情况:

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

通常从dev发送PR到test然后合并:

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的差异时,将等于d diff对c + i diff对f,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出现,那么,因为这是repo中所有分支的提交列表,其中一对需要从repo中消失。换句话说,你需要重写devtest分支的历史。

一些git命令可以做这样的重写,resetrebasefilter-branch

© www.soinside.com 2019 - 2024. All rights reserved.