我在Subversion(以及一般的存储库)讨论中经常看到这些词。 在过去的几年里,我一直在我的项目中使用SVN,但是我从来没有掌握这些目录的完整概念。

它们是什么意思?


当前回答

我不太确定“标签”是什么,但分支是一个相当常见的源代码控制概念。

基本上,分支是在不影响主干的情况下对代码进行更改的一种方式。假设您想要添加一个相当复杂的新功能。您希望能够在进行更改时检入更改,但在完成该特性之前不希望它影响trunk。

首先创建一个分支。这基本上是创建分支时的主干副本。然后在分支中完成所有工作。在分支中所做的任何更改都不会影响trunk,因此trunk仍然可用,允许其他人继续在那里工作(比如做错误修复或小的增强)。一旦你的特性完成了,你就可以把分支集成回主干中。这将把所有的更改从分支移动到主干。

人们为分支使用了许多模式。如果您有一个同时支持多个主要版本的产品,通常每个版本都是一个分支。在我工作的地方,我们有一个QA分支和一个生产分支。在向QA发布代码之前,我们将变更集成到QA分支,然后从那里进行部署。当发布到产品时,我们从QA分支集成到生产分支,所以我们知道在生产中运行的代码与QA测试的代码是相同的。

这里是维基百科上关于分支的条目,因为它们可能比我能更好地解释事情。:)

其他回答

一般来说(工具不可知的观点),分支是用于并行开发的机制。一个SCM可以有0到n个分支。Subversion是0。

Trunk is a main branch recommended by Subversion, but you are in no way forced to create it. You could call it 'main' or 'releases', or not have one at all! Branch represents a development effort. It should never be named after a resource (like 'vonc_branch') but after: a purpose 'myProject_dev' or 'myProject_Merge' a release perimeter 'myProjetc1.0_dev'or myProject2.3_Merge' or 'myProject6..2_Patch1'... Tag is a snapshot of files in order to easily get back to that state. The problem is that tag and branch is the same in Subversion. And I would definitely recommend the paranoid approach: you can use one of the access control scripts provided with Subversion to prevent anyone from doing anything but creating new copies in the tags area.

标签是最终的。其内容不应改变。从来没有。永远。你忘了发行通知里的一行字?创建一个新标记。淘汰或删除旧的。

现在,我读了很多关于“在某某分支中合并某某,然后最终在主干分支中合并”的内容。 这就是所谓的合并工作流,这里没有强制性的内容。这并不是因为你有一个主干分支,你必须合并回任何东西。

按照惯例,主干分支可以代表您的开发的当前状态,但这是一个简单的顺序项目,该项目具有:

没有“预先”开发(用于准备下一个下一个版本,这意味着这些更改与当前的“主干”开发不兼容) 没有大规模的重构(用于测试新的技术选择) 没有以前版本的长期维护

因为对于这些场景中的一个(或所有),你会得到四个“主干”,四个“当前开发”,而不是你在这些并行开发中所做的所有事情都必须合并回“主干”中。

我不太确定“标签”是什么,但分支是一个相当常见的源代码控制概念。

基本上,分支是在不影响主干的情况下对代码进行更改的一种方式。假设您想要添加一个相当复杂的新功能。您希望能够在进行更改时检入更改,但在完成该特性之前不希望它影响trunk。

首先创建一个分支。这基本上是创建分支时的主干副本。然后在分支中完成所有工作。在分支中所做的任何更改都不会影响trunk,因此trunk仍然可用,允许其他人继续在那里工作(比如做错误修复或小的增强)。一旦你的特性完成了,你就可以把分支集成回主干中。这将把所有的更改从分支移动到主干。

人们为分支使用了许多模式。如果您有一个同时支持多个主要版本的产品,通常每个版本都是一个分支。在我工作的地方,我们有一个QA分支和一个生产分支。在向QA发布代码之前,我们将变更集成到QA分支,然后从那里进行部署。当发布到产品时,我们从QA分支集成到生产分支,所以我们知道在生产中运行的代码与QA测试的代码是相同的。

这里是维基百科上关于分支的条目,因为它们可能比我能更好地解释事情。:)

这就是关于软件开发的事情,没有一致的知识,每个人似乎都有自己的方式,但这是因为它是一个相对年轻的学科。

这是我简单的方法,

trunk - trunk目录包含最新的、已批准的和合并的工作主体。与许多人所承认的相反,我的箱子只用于干净、整洁、合格的工作,而不是一个开发区域,而是一个释放区域。

在某个给定的时间点上,当主干似乎已经准备好释放时,它就会被标记并释放。

分支——分支目录包含实验和正在进行的工作。分支下的工作一直停留在那里,直到被批准合并到主干中。对我来说,这是所有工作完成的区域。

例如:我可以有一个迭代-5分支用于产品的第5轮开发,可能有一个原型-9分支用于第9轮实验,等等。

tags—标签目录包含已批准的分支和中继发布的快照。每当一个分支被批准合并到主干中,或者一个发布是由主干组成的,一个被批准的分支或主干发布的快照就会在标记下生成。

我想有了标签,我可以很容易地在时间里来回跳转到感兴趣的点。

主干是保存最新源代码和特性的开发线路。它应该包含最新的错误修复以及添加到项目中的最新功能。

分支通常用于做一些远离主干(或其他开发线)的事情,否则会破坏构建。新特性通常构建在分支中,然后合并回主干中。分支通常包含一些代码,这些代码不一定被分支的开发线所批准。例如,程序员可以尝试对分支中的某些内容进行优化,只有在优化令人满意时才会合并回开发线上。

标记是存储库在特定时间的快照。不应该在这些基础上进行任何开发。它们最常用于获取发布给客户端的内容的副本,以便您可以轻松地访问客户正在使用的内容。

这里有一个链接到一个非常好的知识库指南:

源码控制

维基百科上的文章也值得一读。

标签=在时间上定义的片段,通常用于发布

我认为这就是人们通常所说的“标签”。但是在Subversion中:

它们没有任何正式的含义。文件夹对于SVN来说就是一个文件夹。

我觉得很困惑:一个对分支或标签一无所知的修订控制系统。从实现的角度来看,我认为创建“副本”的Subversion方式非常聪明,但我必须了解它,这就是我所说的有漏洞的抽象。

或者我使用CVS的时间太长了。