SCM中的版本控制和遗留错误修正

时间:2009-01-18 22:56:35

标签: version-control release maintenance

我很抱歉这个糟糕的问题标题,但我会尝试更详细地解释一下自己:

对于我的软件项目,我正在使用Git(但我想这个特定的软件并不重要)。和许多项目一样,我正在计划发布各种版本。当有一个版本时,我可能会为一个提交一个标签 - 例如“1.0”。时间流逝,代码被黑客入侵,最终有一个版本,另一个标签 - 这次是“2.0”。

有一天,我注意到一个严重的错误,它存在于版本1.0和2.0中,需要修复。为了使事情变得困难(也可能更加现实),我不能只在当前的主/主干中修复它并假设每个人都会使用它,因为2.0版本中存在一些向后兼容性,而且人们很懒惰并且不喜欢不想升级。

那么,为了支持这种行为,有什么好方案可以做到:能够在旧版本中进行更改。由于git describe命令(“[latest tag]-[commits since the tag]-[current commit hash]”)的输出,Git似乎将标记与某个级别的版本等同起来。那么我可能无法完全避免使用标签。

我可以感觉到标签和分支的组合是一个好主意,但由于某种原因,我不能用这个细节包围我的头脑。

3 个答案:

答案 0 :(得分:1)

您需要一个分支 - 您将在从发布标记开始的分支上执行维护修复和发布,同时在主(主)分支上继续进行开发。

答案 1 :(得分:1)

当你提到分支和标签时,你似乎已经拥有了大部分答案。标签用于标记某个偶数(如发布),分支用于并行开发。某个版本的维护通常在分支上完成,您可以使用当前大多数VCS来挑选变更集,以便将头/主干中的给定错误修复导入分支,反之亦然。

您可以处理head / trunk / master(无论您当前的“开发分支”是什么),并在各种维护分支中合并错误修正。只要您完成主要或次要版本,就会创建一个分支进行维护。

有很多方法可以达到你想要的效果。

答案 2 :(得分:1)

你肯定想要考虑使用分支。 Git非常支持这类开发的分支。

举例来说,您的线性版本历史记录可能如下所示:

---A---B---C[1.0]---D---E---F[2.0]---G---H

如果您发现1.0中的错误并想要修复它,则不能简单地在提交C和D之间插入新的提交。因此,您可以创建这样的分支:

---A---B---C[1.0]---D---E---F[2.0]---G---H[2.1]
            \
             C1---C2[1.1]

提交C1和C2修复该分支中的问题,您可以在其中标记版本1.1。现在假设您在版本2.1中进行了更改(G),您希望将其移植到版本1.1以在那里进行相同的更改。您可以使用git cherry-pick执行以下操作:

---A---B---C[1.0]---D---E---F[2.0]---G---H[2.1]
            \
             C1---C2[1.1]---G1[1.2]

提交G1与提交G相关,除了它可以应用于版本1.1而不是版本2.0。

在这些示例中,分支(附加的开发流)是关键概念,而标记只是一种方便的方式,可以使名称引用项目在特定时间点所处的状态。 Git支持许多其他操作分支的方法,特别是使用强大的git rebase命令。