选择樱桃提交会创建具有相同内容的新提交。如果我通过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
我想实现三件事:
d-i
; test: a-b-c-g-h-d-i
; e-f
的关系
通过历史。我该如何实现?还是应该重组git工作流程以防止此类事情发生?
这是此问题的真实示例:
这里是拉取请求的设置,红色框中的提交已经被挑选到目标分支。
这是结果历史记录。橙色的是来自cherrypick的提交。红色为拉取请求的提交。红色提交没有相关联的更改,并且完全重复了橙色提交的消息。
以下是完成的PR请求的详细信息。它具有这两个提交,不应存在,因为pull请求不会应用这些提交描述的更改。
答案 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
的差异等于d
与c
的差异+ i
与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-h
或e-f
,那么,由于这是回购中所有分支的提交的列表,因此一对对中的一个需要从中消失回购。换句话说,您需要重写dev
或test
分支的历史记录。
几个git命令可以reset
,rebase
,filter-branch
来重写。