GitHub的PR壁球导致错误的合并冲突

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

我不知道如果这是一个错误的GitHub,想看看是否有人已经看到了这个问题。我有masterdevfeature分行在我GitHub库。

过程通常是这样的:

master : A
dev    : A 
feature: A - B - C

然后,我合并featuredev和删除feature分支,但我不壁球保留所有的提交历史:

master : A
dev    : A - B - C 

当我融入master,我壁球合并,使其看起来更清洁:

master : A - BC
               \
dev    : A - B - C 

据我所知,BC更像是一个单独的提交在这一点上,但在masterBC代码dev代码在C是相同的。

当我masterdev在上述阶段之间的比较,我注意到一个奇怪的问题;我看到了很多的冲突,当我再次尝试,反之亦然合并devmaster

冲突不会改变我是否合并devmastermasterdev;例如,如果dev -> master代码不同的是-a and +b,我会看到同样的差异,当我尝试合并master -> dev,不-b and +a

我们要继续对dev分支之上构建的功能,并保持它的历史,所以将其删除,并创建一个基于master一个新的分支不会是一个选项。

我使用的GitHub壁球和合并其他成员需要批准的更改之前,我可以合并成master

任何人都可以解释为什么我看到这个问题,以及如何解决它?

git github merge
1个回答
1
投票

此图:

master : A - BC
               \
dev    : A - B - C 

意味着有某种CBC之间的联系。

不存在这样的链接,但有AB之间的链路(从B具体回A)。因此,更准确的图纸是:

A--D   <-- master
 \
  B--C   <-- dev

其中D具有相同的快照作为C,但是不相关的,因此而得名D

这是整个问题的根源:

我看到了很多的冲突,当我再次尝试,反之亦然合并devmaster

至于GIT中而言,在该devmaster对应点是提交A。因此混帐必须走差异从AC并再次应用,为master,其中,在Git的眼里,没有任何BC呢。

我们要继续对dev分支之上构建的功能,并保持它的历史,所以将其删除,并创建一个基于master一个新的分支不会是一个选项。

在这种情况下,停止做南瓜,西葫芦,因为有效地“杀死了”一个分支:你永远不应该做任何更多与B-C提交。只要做一个真正的合并。从GitHub的网络界面,选择“合并”将做到这一点;在命令行上,使用git merge --no-ff。然后,而不是一个新的完全独立提交D,你会得到一个合并提交(我还是会打电话给D):

A------D   <-- master
 \    /
  B--C   <-- dev

当你做dev你会得到更多的工作:

A------D   <-- master
 \    /
  B--C--E--F   <-- dev

你现在可以做的另一种合并。这个时候没有必要--no-ff,但它仍然会很好地工作;在GitHub的网络用户界面没有什么改变无论是。你会得到一个新的合并提交G

A------D-----G   <-- master
 \    /     /
  B--C--E--F   <-- dev

这第二个合并的输入是提交C作为合并基础,提交D--ours,并承诺F--theirs,因此合并将顺利进行。和以前一样,在CD快照将匹配,并在F快照和G将匹配。

如果你想看到什么但从master的角度发生了严格的使用:

git log --first-parent master

这会指引git log仅看每个第一母公司合并提交。也就是说,Git会通过展示你提交G开始,到master点。然后,它会从提交G其第一个父D,并显示移动。然后,它会从D移动到提交其第一个父A和表演。由于没有更早提交可言,git log现在结束了,与它的工作完成。

(当然,如果有A之前提交,git log将继续向他们展示,但在这里,所有的图纸都A之前没有提交。)


推荐问答