我有一些困难理解如何使用标签与分支在git。

我只是将当前版本的代码从cvs移到git,现在我将针对特定的特性处理该代码的一个子集。其他一些开发人员也将致力于此,但并不是我们团队中的所有开发人员都会关心此功能。我应该创建一个分支还是一个标签?在什么情况下我应该使用其中一种而不是另一种?


当前回答

从CVS中您需要了解的是,在设置分支时不再需要创建目录。 不再有“粘贴标签”(只能应用于一个文件),或“分支标签”。 分支和标记是Git中两个不同的对象,它们总是应用于all repo。

您将不再(使用SVN)必须显式地构造您的存储库:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

这种结构源于CVS是一个修订系统而不是版本系统(参见源代码控制vs.修订控制?) 这意味着通过CVS的标记和SVN的目录副本模拟分支。

如果您习惯于签出标记并开始在其中工作,那么您的问题就有意义了。 你不应该这样做;) 标签应该表示一个不可变的内容,只用于访问它,并保证每次都获得相同的内容。

在Git中,修订的历史是一系列的提交,形成了一个图表。 分支是图的一条路径

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit

如果签出一个标记,您将需要创建一个分支来开始从它开始工作。 如果你签出一个分支,你将直接看到该分支的最新提交('HEAD')。

关于所有的技术细节,请参阅Jakub narylbski的答案,但坦率地说,在这一点上,你还不需要所有的细节;)

主要的一点是:一个标签是一个简单的指向提交的指针,你永远不能修改它的内容。你需要一个分支。


在你的例子中,每个开发人员都致力于一个特定的功能:

是否应该在各自的存储库中创建自己的分支 跟踪来自同事的存储库的分支(在同一特性上工作的那个) 拉/推是为了和同事分享你的工作。

您可以不直接跟踪同事的分支,而是只跟踪一个“官方”中央存储库的分支,每个人都将他/她的工作推送到这个存储库,以便集成和共享每个人的工作。

其他回答

最好的解释似乎是标签充当只读分支。您可以使用分支作为标记,但您可能会无意中使用新的提交更新它。只要标签存在,它们就保证指向相同的提交。

简单:

标签总是指向项目的同一个版本,而头部则随着开发的进展而变化。

Git用户手册

简单的答案是:

分支机构: 每次提交到存储库时,当前分支指针都会移动

but

标签:标签指向的提交没有改变,事实上标签是该提交的快照。

Git寓言解释了典型的DVCS是如何创建的,以及它们的创造者为什么要这样做。另外,你可能想看看Git for Computer Scientist;它解释了Git中每种类型的对象的功能,包括分支和标记。

标记用于标记版本,更具体地说,它引用分支上的一个时间点。分支通常用于向项目中添加特性。