假设我们在git中使用以下分支策略:
master
分支,用于持续开发新功能。release
分支以稳定。 创建release
分支后,一些开发人员继续提交master
(处理后续版本的功能),而其他开发人员则努力完成当前版本。在release
分支存在期间,来自master
的提交被而不是合并以保持发布分支的稳定性。
在发布时,release
分支中的最终提交将使用发布版本进行标记。然后,从release
到master
执行合并(显然不是快进,因为两个分支上的并发开发)。
现在想象一下(在更多提交到master
之后),我们想要将存储库重置回上一版本的状态。
不会回滚到master
中标记的版本提交会导致存储库状态与我们在release
分支上的状态不同吗?(除非我是缺少某些东西,情况就是这样,因为在两个分支处于活动开发期间提交到master
,即使在回滚master
之后仍然在提交历史中,因为它们发生在标记的发布提交之前。)
重新绑定而不是将release
分支合并回master
会解决这个问题,但对于处理master
的多个开发人员而言,这不是一个可行的选择。
有什么想法吗?
编辑:感谢@ jthill的回答,添加图表来解释情况以及为什么我感到困惑。
这是实际发生的事情的图表:
...o---X---o---o---o---M master
\ /
a---b---c---R release
^
(v1.0, final commit in release branch)
现在,这是一个线性提交历史记录从master
看起来是什么样的图表(正在推动我错误的心理模型) - 请注意o
引用和a
/ b
/ c
refs根据其提交时间戳混合。这就是让我失望的原因 - 平坦的提交历史记录并未明确表示如果您回滚到引用R
,o
之后的所有X
提交也将被删除!
...o---X---o---a---b---o---c---o---R---M master
^
(v1.0, final commit in release branch)
答案 0 :(得分:1)
从您的文字说明中
- 发布分支中的最终提交已标记为
- 然后,从发布到主
执行合并
我从中得到这张照片:
...o---X---o---o---o...M master
\ /
o---o---o...R release
^
(v1.0, final commit in release branch)
你在这里只命名了三个参考,这张照片中显示了参考。注意
不会回滚到主要
中的标记版本提交
与你描述的tag-then-merge序列不一致,但是v1.0
是指[{1}}还是R
,你提到的唯一引用是{{1}是M
。
回答你的问题:
不会回滚到master中的标记版本提交结果,而不是我们在发布分支上的存储库状态吗?
M
会将这三个裁词准确地留在那张照片中,所以,不。
现在:假设我以某种方式误解了你。想想:无论我的误解是什么,为了纠正我,你必须告诉我哪些提交是哪些提交 - 所以如果你现在把它们放回去,你就会有你的愿望。