dev 分支上有一大堆的 commit 记录,其中部分记录已经 cherry-pick 到了 master 分支,现在如果将整体的 dev 分支 merge 到 master 分支,那么之前已经 cherry-pick 过的记录会怎样?
注意: cherry-pick 的过程了相应的在 master 分支上生成了对应的 commit 记录
在 csdn 上找到了想问的问题,但是感觉不太详细,希望大佬能有相关资料分享下或解答下。
dev 分支上有一大堆的 commit 记录,其中部分记录已经 cherry-pick 到了 master 分支,现在如果将整体的 dev 分支 merge 到 master 分支,那么之前已经 cherry-pick 过的记录会怎样?
注意: cherry-pick 的过程了相应的在 master 分支上生成了对应的 commit 记录
在 csdn 上找到了想问的问题,但是感觉不太详细,希望大佬能有相关资料分享下或解答下。
5 回答2.9k 阅读
3 回答2.7k 阅读
3 回答1k 阅读
2 回答445 阅读✓ 已解决
485 阅读
假设你是这样的情况:
现在我们在
master
上cherry-pick
E
,然后得到:这时候如果我们在
master
上merge
dev
,则会得到:其中,
G
是E'
与F
的 merge commit。如果我们在master
上git log
,看起来当然好像是E
被 commit 了两次。原因有两点:git cherry-pick
后的E'
与E
的 commit hash 是不同的git merge
执行的其实是--no-ff
,因为cherry-pick
之后,master
与dev
的历史线对不上。具体来说,相对于cherry-pick
之前,现在在C
出现了 diverge,master
多了个E'
而dev
并没有这个E'
。请注意,E'
和E
在 git 看来,是两个不同的 commit。别忘了,git 不是存储 diff,而是存储 snapshot因此,解决方案也不难想象,我们只要想办法让
dev
与master
历史线对上就好了。这可以通过在dev
上rebase
master
来实现。这是cherry-pick
之后的样子:然后,我们在
dev
上rebase master
,就会得到:这时候,历史线对的上,
git merge
会按照 fast forward 的方式进行,我们会在merge
后得到: