我们有一个有2个分支的回购。一个名为dev
,另一个名为prd
。我们按照正常流程从我们的Fork发送拉取请求,以将我们的更改与dev
合并。然后,从dev
向prd
进行拉取请求和合并,以使这些更新生效。
问题是在从dev
合并到prd
的同时,prd
分支永久地“超前”dev
(有时提前堆栈)。如果我们尝试将prd
合并回dev
,则会产生相反的效果,除非它会落后。
我们怎样才能使两个分支同步,因为这些状态会导致团队混淆。
注意:它没有文件更改,只有正在记录的提交。
答案 0 :(得分:3)
由于合并在Git中的工作方式,这是正常行为。
在Git中,合并是一个像其他任何一样的提交,它只有两个(或更多)父母。它包含合并内容所需的更改。将分支合并到另一个分支时,源分支不会更改。因此,当dev被合并为prod时,只有prod会发生变化。
这是一个直观的例子。让我们说dev是在提交3分支prod prod现在在commit 7并且dev在E. prod被检查出来。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 [prod] [HEAD]
\
A -- B -- C -- D -- E [dev]
当使用命令git merge dev
将dev合并到prod中时,结果为。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [HEAD]
\ /
A -- B -- C -- D -- E [dev]
合并会导致父提交为7和E的新提交。它包含将它们合并在一起所需的所有更改。 prod推进到这个新的提交。开发者仍留在E。
这就是为什么prod在合并之后总会领先于dev的原因。例外是"快速转发"。让我们说这发生了。
1 -- 2 -- 3 -- 4 [prod] [HEAD]
\
A -- B -- C [dev]
开发人员在4月开始分支。开发工作已经完成,但没有开发。检查结果。当git merge dev
完成后,git会认识到不需要合并并快速前进"。
1 -- 2 -- 3 -- 4
\
A -- B -- C [dev] [prod] [HEAD]
prod被推进到C,同一个地方是dev。您可以使用git merge --no-ff
覆盖此行为,而不是快进"。建议用于功能分支,其中保留一组提交都是内聚功能的一部分这一事实很重要,但如果您只是让生产分支赶上开发,则不必要。
您的合并不是快进的事实表明提交直接发送到prod ,这些是我们示例中的提交4 - 7。在许多工作流程中,这不应该发生,应该只对dev进行提交然后合并到prod中。你应该调查一下,prod中可能有变化,而不是dev。有人可能热修补了产品。
解决这种情况的最简单方法是将dev合并为prod,然后立即删除dev并再次将其分支出prod。别担心,分支历史将被保留。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [dev] [HEAD]
\ /
A -- B -- C -- D -- E
git branch -d dev
会阻止您删除尚未完全合并的分支。例如,如果存储库看起来像这样......
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [HEAD]
\ /
A -- B -- C -- D -- E -- F -- G [dev]
你跑git branch -d dev
,git会拒绝删除分支。 不要使用-D或-f强制它,否则你将失去dev的工作。只需将dev合并为prod,然后再试一次。
还有其他方法可以处理这种情况,但这是最简单的方法。在那之后,你的提交应该快进。