由于合并Git的工作方式,这是正常的行为。
在Git中,合并与其他任何提交一样,它只有两个(或更多)父项。它包含合并内容所需的更改。当您将一个分支合并到另一个时,源分支不会更改。所以当dev被合并为prod时,只有prod会改变。
下面是一个视觉示例。假设dev在第3次提交时分支产品。prod现在是第7次提交,dev是E.检出。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 [prod] [HEAD]
\
A -- B -- C -- D -- E [dev]
当dev与命令git merge dev
合并为prod时,这就是结果。
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 [prod] [HEAD]
\ /
A -- B -- C -- D -- E [dev]
在新的合并结果提交父母均为7和E.它包含了所有必要的修改,以把它们合并起来。 prod被推进到这个新的提交。 dev仍然在E.
这就是为什么prod总是会在合并之后领先dev的原因。例外是“快进”。假设发生这种情况。
1 -- 2 -- 3 -- 4 [prod] [HEAD]
\
A -- B -- C [dev]
dev在产品4处分支出去。已经完成了关于dev但不是产品的工作。 prod被检出。当git merge dev
完成后,git会识别出不需要合并,并执行“快进”。
1 -- 2 -- 3 -- 4
\
A -- B -- C [dev] [prod] [HEAD]
prod被推进到C,dev是同一个地方。您可以使用git merge --no-ff
替代“没有快进”的行为。这被推荐用于特性分支,其中保留了一组提交都是一个内聚特性的一部分的事实是重要的,但如果你只是让生产分支赶上开发,那么这是不必要的。
事实上,你的合并不是快进表明提交直接提交到产品,在我们的例子中是提交4 - 7。在许多工作流程中,这不应该发生,提交只应该开发,然后合并为产品。你应该调查一下,可能会有变化,但不在开发中。有人可能热补丁产品。
解决这种情况的最简单方法是将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
,混帐将拒绝删除该分支。 不要使用-D或-f强制它否则你将失去开发工作。只需将dev合并到prod中,然后再试一次。
还有其他方法可以处理这种情况,但这是最简单的。之后,你的提交应该快进。
'git log --oneline --left-right dev ... prd'的输出是什么? (提示:它应该为您提供一个分支上的所有提交列表,但不包括另一个分支上的提交列表)。 – 2014-12-10 23:59:00