我相信这个问题与以下问题类似这个问题 https://stackoverflow.com/q/9500399/110204:合并并不像您想象的那样工作。合并只是比较文件状态的问题,它是not将更改从一个分支应用到另一个分支的问题。
你的起点是这样的历史:
UAT: ... x --- y --- z
\
default: ..... a --- b --- c
where x
and y
包含 UAT 的配置设置和b
是没有配置设置的虚拟合并。所以文件在b
看起来就像他们在a
——他们是虚拟合并的。
如果您现在对default
如果您想要升级到 UAT,您将与以下人员合作:
UAT: ... x --- y
\
default: ..... a --- b --- c
合并是在y
and c
。这是共同祖先所在的退化合并y
本身。这意味着之间的所有变化b
and c
将在三向合并中“获胜”。三向合并中 hunk 的合并方式表如下:
ancestor local other -> merge
old old old old (nobody changed the hunk)
old old new new (they changed the hunk)
old new old new (you changed the hunk)
old new new new (hunk was cherry picked onto both branches)
old foo bar <!> (conflict, both changed hunk but differently)
请注意,合并结果并不取决于合并的“方向”:该表关于合并的“方向”是对称的local
and other
列。在这里,两者ancestor
and local
is y
, and other
is c
。所以表变成:
ancestor local other -> merge
old old new new (they changed the hunk)
可以看到合并结果总是包含new
所做的改变c
.
合并是否退化并不重要。假设您在 UAT 上有一个新的提交,并且该提交不触及配置字符串,那么您在合并时会得到相同的行为(无论哪个方向,合并都是对称的)。
正常的解决方案解决这个问题的方法是将配置字符串外部化。将它们放在版本控制之外的某个地方 - 环境变量、未版本化的配置文件等。如果可以的话,请将配置文件作为版本控制下的template。然后,您为 UAT 分支创建一个无版本控制的配置文件,其中包含版本控制的配置文件。您可以根据需要覆盖此无版本配置文件中的设置。