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
我想实现三件事:
d-i
;test: a-b-c-g-h-d-i
;e-f
的关系。我怎样才能做到这一点?或者我应该重组git工作流程以防止这样的事情发生?
以下是此问题的真实示例:
这是拉取请求的设置,红色框中的提交已经被挑选到目标分支。
这是由此产生的历史。橙色是来自cherrypick的提交。红色是来自pull请求的提交。红色提交没有相关的更改,并且完全重复橙色提交的消息。
以下是完成的PR请求的详细信息。它具有这两个提交,它们不应该存在,因为pull请求不会应用这些提交所描述的更改。
现在的情况:
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-h
或e-f
出现,那么,因为这是repo中所有分支的提交列表,其中一对需要从repo中消失。换句话说,你需要重写dev
或test
分支的历史。
一些git命令可以做这样的重写,reset
,rebase
,filter-branch
。