SVN中标签和分支的区别是什么?

57

我多年来一直在使用SVN分支和TRUNK,但从未使用过标签。

有人可以指导一下它们之间的主要区别吗?标记的主要目的是什么?


3
如答案所示:它们是相同的。其他版本控制系统(例如Git)严格区分分支和标签。 - eckes
听起来是这样。所以在简单的场景中,当您有1行:PROD和第2个UAT时-您如何使用它?为PROD进行跟踪,UAT分支正在开发中,但TAG用于快照每个最终用户发布? - Maciej
1
http://nvie.com/posts/a-successful-git-branching-model/ 这篇文章非常详细地解释了这个主题。 - eckes
4个回答

70
这段内容来自于http://svnbook.red-bean.com/en/1.5/svn.branchmerge.tags.html “等等,难道这个标签创建过程不就是我们用来创建分支的过程吗?”实际上,的确是这样的。在Subversion中,标签和分支之间没有区别。它们都只是由复制创建的普通目录。与分支一样,复制的目录之所以成为“标签”,仅仅是因为人们决定将其视为快照而已:只要没有人向目录提交更改,它就永远保持快照状态。如果有人开始对其进行提交,则它就变成了一个分支。
从技术上讲,它与分支相同,但从概念上讲,我们把它当作一个快照。在我的svn存储库中,我知道分支将包括可能已经合并到主干的大功能,但我只使用标签来标记发布版本。

24

唯一的区别就是你用它们来干什么,它们本质相同。

分支(branch)是你可以在代码的另一个版本上进行开发工作,与主干不同。

标签(tag)用于“标记”发布版本。比如我只在主干上工作。当我将 V1 发送给客户时,我会为它创建一个“V1标签”。然后我会继续开发 V2。当客户在 V1 上遇到问题时,我可以只检出标签并开始在完全相同的版本上调试问题,以便更好地服务客户。你可以提交更改到标签,但最好不要这样做。如果你需要发布 V1.1 版本,那么就从与 V1 标签相同的版本创建一个分支(branch),并将修复内容提交到该分支(branch)中,在发布 V1.1 时再打标签。


8
"Trunk"和"Branches"通常用于活跃和当前的开发。用户在这里提交/检出文件。这通常是许多活动发生的地方。
另一方面,“Tags”通常用于创建您的开发的快照和里程碑。对于团队在“Tag”文件夹上进行任何提交/检出并不理想。
以下是两个标签适用性的示例:
1.分支存档-当发布或功能分支已完成或完全放弃时,通常会删除该分支,并将其从HEAD修订版本中有效地隐藏。有些人通常不删除这些文件夹进行归档,因为他们更喜欢看到所有的发布/项目。但这可能会导致分支树难以导航。因此最好只在分支文件夹的HEAD修订版本中保留活动和运行的项目发布和功能。您可以创建这些归档分支的最后一个修订版本的标记副本,以便您仍然可以在HEAD修订版本中看到它们。这样您就可以在分支归档之前快速获取分支的最后一个修订版本的快照,并且还可以使分支树保持整洁。
2.保持里程碑-项目通常具有许多开发阶段。Dev,UT,QA,pre-QA,post-QA,BAT,post-BAT,PROD,pre-PROD,post-PROD。您可以使用标记在每个重要阶段制作开发快照,而不是依赖修订号,日期或注释。
标记可以帮助组织事物,但有时也可能会混乱。因此,在为标记文件夹命名时需要采用标准命名约定。

2

标签和分支在技术上是等价的。它们的区别在于它们通常的使用方式。

您可以使用分支来制作可编辑的代码副本,以便您同时开发稳定和工作正常的副本。

您可以使用标签来制作只读的代码副本,以便稍后方便地获取该代码。以下是每日构建中使用它的方法。每个每日构建都只是创建一个包含该构建编号的名称的标签。一旦您稍后需要获取那个很久以前的构建的源代码(例如,为了重现错误),您只需从该标签中导出它们即可。


标签是只读的,那么如果在重现了该错误后您想要修复它,但带有错误的功能已从当前主干中删除,会发生什么? - BornToCode
1
@BornToCode:一种选择是从标签分支并在分支中进行修复。另一种选择是切换到已删除代码的较新版本。 - sharptooth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接