Github Branches总是领先或落后

时间:2014-12-10 23:51:42

标签: git github

我们有一个有2个分支的回购。一个名为dev,另一个名为prd。我们按照正常流程从我们的Fork发送拉取请求,以将我们的更改与dev合并。然后,从devprd进行拉取请求和合并,以使这些更新生效。

问题是在从dev合并到prd的同时,prd分支永久地“超前”dev(有时提前堆栈)。如果我们尝试将prd合并回dev,则会产生相反的效果,除非它会落后。

我们怎样才能使两个分支同步,因为这些状态会导致团队混淆。

注意:它没有文件更改,只有正在记录的提交。

1 个答案:

答案 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,然后再试一次。

还有其他方法可以处理这种情况,但这是最简单的方法。在那之后,你的提交应该快进。