【问题标题】:Git tags for release versions with divergent master and release branches具有不同主分支和发布分支的发布版本的 Git 标记
【发布时间】:2023-03-19 15:45:01
【问题描述】:

假设我们在 git 中使用以下分支策略:

  • master 分支用于持续开发新功能。
  • release 分支在即将发布的版本之前的某个时间点创建以稳定。

创建release 分支后,一些开发人员会继续提交master(为以后的版本开发功能),而其他开发人员则致力于完成当前版本。在release 分支存在期间,来自master 的提交合并,以保持发布分支的稳定性。

在发布时,release 分支中的最终提交带有发布版本的标记。然后,从releasemaster 执行合并(显然不是快进,因为两个分支同时开发)。

现在想象一下,稍后(在对master 进行更多提交之后),我们想要将存储库重置回上一个版本的状态。

回滚到master 中的标记发布提交不会导致与我们在release 分支上的不同的存储库状态吗?(除非我遗漏了什么,这会出现这种情况,因为在两个分支都处于积极开发阶段期间对master 的提交即使在回滚master 之后仍保留在提交历史记录中,因为它们发生在标记的发布提交之前。)

Rebase 而不是将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/@ 987654343@ refs 根据它们的提交时间戳混合在一起。这就是让我失望的原因——平坦的提交历史并没有清楚地表明,如果你回滚到 ref R,那么在 X 之后的所有 o 提交也将被删除!

...o---X---o---a---b---o---c---o---R---M  master
                                   ^
                                 (v1.0, final commit in release branch)

【问题讨论】:

    标签: git version-control merge branch


    【解决方案1】:

    根据你的文字描述,

    • 发布分支中的最终提交被标记
    • 然后,从 release 到 master 执行合并

    我从中得到这张照片:

     ...o---X---o---o---o...M  master
             \             /
              o---o---o...R    release
                          ^
                        (v1.0, final commit in release branch)
    

    您在这里只命名了三个 refs,即这张图片中显示的那些。请注意

    不会回滚到 master 中的标记发布提交

    不符合您描述的标记然后合并序列,但无论v1.0 是指R 还是M,您提到的唯一参考自M 以来发生变化是master

    回答你的问题:

    在 master 中回滚到标记的发布提交不会导致与我们在发布分支上的不同的存储库状态吗?

    git checkout -B master M 会将这三位裁判留在他们在图片中的位置,所以,不会。


    现在:假设我以某种方式误解了你。想一想:不管我有什么误解,要纠正我,你必须告诉我哪些 refs 是在哪些提交上——所以如果你现在把它们放回那里,你就会有你的愿望。

    【讨论】:

    • 知道了。你的图片是正确的;我的心理模型是错误的。我在想,在将release 合并回master 之后,发布分支上R 后面的3 个引用将嵌入到从XM 提交之间的任何时间。但实际上,每一项的更改都在新的合并提交M 中提交。最后一个问题是,即使 release 分支被删除,这些引用是否仍可访问(包括 R 的标记)?
    • 只有当你告诉 git 移动它们时,引用才会移动。其他一切都是不可变的,从任何已知参考完全无法访问的东西最终将被 gc'd (参见 the config docs 以了解 gc 设置),例如the prune docs 了解正在发生的事情
    • 另一种说法:如果我在合并后查看master 的提交历史记录,我不会在其中看到引用R(带有我的版本标签)对吗?我必须专门签出该标签?
    • 无论您的 ref 在哪里,git log 都会默认向您显示所有可访问的内容。如果您不想在合并时 master,请将其重置为 M~,M 的主线父级。
    • 我编辑了我的问题以添加一张图表,说明我在合并后坐在 master 分支上时的想法(和看到的)。
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 2015-01-26
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2013-05-09
    • 2012-09-30
    相关资源
    最近更新 更多