Version control SCM中的版本控制和遗留错误修复

Version control SCM中的版本控制和遗留错误修复,version-control,release,maintenance,Version Control,Release,Maintenance,我为这个糟糕的问题标题感到非常抱歉,但我会尝试更详细地解释我自己: 我在我的软件项目中使用Git(但我想在这种情况下,特定的软件并不重要)。和许多项目一样,我计划发布各种版本。当发布时,我可能会为提交分配一个标记,例如“1.0”。随着时间的推移,代码被黑客攻击,最终有一个版本,带有另一个标签——这次是“2.0” 有一天,我注意到一个严重的bug,它出现在1.0版和2.0版中,需要修复。为了使事情变得困难(可能也更现实),我不能在当前主/主干中修复它,并假设每个人都会使用它,因为2.0与1.0之间

我为这个糟糕的问题标题感到非常抱歉,但我会尝试更详细地解释我自己:

我在我的软件项目中使用Git(但我想在这种情况下,特定的软件并不重要)。和许多项目一样,我计划发布各种版本。当发布时,我可能会为提交分配一个标记,例如“1.0”。随着时间的推移,代码被黑客攻击,最终有一个版本,带有另一个标签——这次是“2.0”

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

那么,为了支持这种行为,有什么好的方案:能够在旧版本中进行更改。Git似乎在某种程度上将标记等同于发布,因为Git descripe命令(“
[latest tag]-[commits since the tag]-[current commit hash]
”)的输出。那么,我可能无法完全避免使用标签


我觉得将标签和分支组合在一起是个好主意,但由于某些原因,我不能用这个来概括细节。

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

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

您可以使用head/trunk/master(无论您当前的开发分支名为什么)并合并各种维护分支中的错误修复。一旦完成了主要或次要版本,就创建了一个用于维护的分支


有很多方法可以实现您的目标。

您肯定想研究使用分支来实现这一目标。Git非常支持这种类型的开发

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

---A---B---C[1.0]---D---E---F[2.0]---G---H
---A---B---C[1.0]---D---E---F[2.0]---G---H[2.1]
            \
             C1---C2[1.1]
如果您在1.0中发现一个bug并想要修复它,您不能简单地在提交C和D之间插入一个新的提交。因此,您可能会创建如下分支:

---A---B---C[1.0]---D---E---F[2.0]---G---H
---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]
Commit G1与Commit G相关,只是它可以应用于版本1.1而不是版本2.0之上


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

如果你能更详细地解释一下你的答案,也许举个例子,我相信人们(不排除我)会得到更好的启发。我曾经离线过一段时间,Greg Hewgill做了很好的解释,因此,我将放弃代表点,让他自己回答。更多信息请指向。