我有一些困难,了解如何使用标签与分行 的git 。
我刚搬到我们代码的当前版本从CVS到Git的 ,现在我将要工作的代码的特定功能的一个子集。 其他一些开发商将在此合作为好,但不是我们组所有的开发商正打算去关心这个功能。 我应该创建一个分支或标记? 在什么情况下,我应该使用一个与其他?
我有一些困难,了解如何使用标签与分行 的git 。
我刚搬到我们代码的当前版本从CVS到Git的 ,现在我将要工作的代码的特定功能的一个子集。 其他一些开发商将在此合作为好,但不是我们组所有的开发商正打算去关心这个功能。 我应该创建一个分支或标记? 在什么情况下,我应该使用一个与其他?
一个标签代表在某一瞬间的版本一个特定的分支。 分支代表开发一个单独的线程可以与上相同的代码库等开发工作同时运行。 对一个分支最终可能会被合并到另一个分支合并的话。
通常你会标记特定的版本,以便可以重新创建它,比如,这是我们运到XYZ公司的版本分支更多的是一种战略上的代码的特定版本提供持续更新,同时继续做它的发展。 你会做的交付版本中的一个分支,继续在主线的发展,但要bug修复到代表交付版本的分支。 最终,你会合并这些bug修复回主线。 你会经常使用这两个分支和标记在一起。 您将有一种既适用于主线各种标签及其分支标记一起,你可能要重新创建每个分支特定版本(那些交付给客户,例如) - 交货,错误诊断等。
只要你想,使其或复杂的 - - 它实际上比这更复杂,但这些例子应该给你的不同的想法。
从理论角度:
从技术面来看:
refs/tags/
命名空间,可以指向对象 (注释和可选GPG签署标签),或者直接提交对象 (当地名少用轻量级的标签),或在极少数情况下, 标签甚至树对象或者blob对象 (如GPG签名)。 refs/heads/
命名空间,只能指向对象提交 。 的HEAD
指针必须引用一个分支(符号引用)或直接连接到一个提交(独立HEAD或无名分支)。 refs/remotes/<remote>/
命名空间,然后按照普通的分支在远程存储库<remote>
。 参见gitglossary手册页:
科
A“分支”是发展的有效行。 最近提交的一个分支被称为该分支的前端。 分支的尖端由分公司负责人,其额外的开发是在分支完成前进引用。 单个git仓库可以跟踪分支任意数量的,但你的工作树与他们的只是一个有关(“当前”或“签出”分支)和HEAD指向分支。
标签
一个REF指向标签或提交对象。 相较于头,标签不被提交改变。 标签(标签不是对象)存储在
$GIT_DIR/refs/tags/
。 [...]。 的标签被最通常用于标记在提交祖先链中的特定点。标签对象
含有REF指向另一个对象,它可能包含消息就像一个提交对象的对象。 它也可以包含一个(PGP)的签名,在这种情况下,它被称为“签署标签对象”。
如果你觉得你的资料库作为一本书,记载你的项目进度...
你可以把一个分支那些粘书签中的一种:
一个全新的存储库只有那些(称为一个master
),其自动移动到页面最后(认为提交 )你写的。 不过,你可以自由地创建和使用多个书签,以纪念在书中其他兴趣点,这样你就可以迅速恢复它们。
此外,您还可以随时移动某个特定的书签书的其他页面(使用git-reset
,例如); 兴趣点通常随时间变化。
你可以把标签为章节标题 。
它可以包含一个标题(认为附注的标签 ),或者没有。 标记是类似的,但不同的分支,因为它标志着在书中对历史的兴趣点。 为了保持其历史方面,一旦你共享的标签(即它推到一个共享的远程), 你不应该将其移动到书中其他地方。
你需要认识到,从CVS来了,就是你设立分支机构时,不再创建目录 。
没有更多的“粘性标签”(可应用到只有一个文件),或者“分支标签”。
分公司和标签都是在Git中两个不同的对象,他们总是适用于所有回购。
您将不再(SVN的这段时间)必须明确地组织你的存储库:
branches
myFirstBranch
myProject
mySubDirs
mySecondBranch
...
tags
myFirstTag
myProject
mySubDirs
mySecondTag
...
该结构来自于一个事实CVS是一个版本的系统 ,而不是一个版本的系统(见源代码控制与版本控制? )。
这意味着分支通过标签为CVS,目录副本SVN效仿。
你的问题让感觉,如果你是用来检出一个标签,并开始在它的工作 。
你不应该;)
的标签应该代表一个不变的内容,仅用于与保证访问它每次都得到了相同的内容。
在Git中,修改的历史,是一系列提交,形成一个曲线图。
一个分支是图的一个路径
x--x--x--x--x # one branch
\
--y----y # another branch
1.1
^
|
# a tag pointing to a commit
见的JakubNarębski的回答了所有的技术问题,但坦率地说,在这一点上,你不需要(还)所有细节;)
主要的一点是:标签是一个简单的指针来提交,你将永远不能修改其内容。 你需要一个分支。
在你的情况下,每个开发人员工作的一个特定的功能:
相反,跟踪你的同事的直接分支,你可以跟踪只有一个“正式”中央资料库,以人人推,以整合和共享每个人的工作,为这个特殊的功能,他/她的工作的分支。
分行是木制的,并从树干生长。 标签是纸做的(木的衍生物)和从树的各个地方挂像圣诞饰品。
你的项目是树,你的功能将被添加到该项目将生长在一个分支。 答案是分支。
它看起来像解释的最好办法是,标签充当只读分支机构。 您可以使用一个分支作为标记,但你可能无意中用新提交更新。 标签是保证指向同一个commit,只要它们的存在。
标签既可以符号或无符号 ; 分支从未签署。
签名标签不能移动,因为它们都是以加密方式(与签名)绑定到特定的提交。 无符号标签不绑定,它是可以移动它们(但移动标签是不正常的使用情况下)。
分行不仅可以移动到不同的提交,但预计这样做。 你应该用一个分支为当地的发展项目。 这并不完全意义的承诺工作“在标签上”一个Git仓库。
在Git的比喻解释了如何一个典型的DVCS被创建,为什么它们的创造者做他们做了什么。 此外,你可能想看看的Git的计算机科学家 ; 它解释了什么是Git中每种类型的对象不包括分支和标签。
的标签被用于标记的版本,更具体地说,它的一个分支在参考时间点。 分支通常用于功能添加到项目中。
简单:
标签有望总是在同一个版本的一个项目点,而头可望提前在开发过程。
Git的用户手册
我喜欢把分支机构作为你要去的地方 ,如标签 ,你曾经去过的地方 。
的标签,感觉就像在过去,一个特定的重要点的书签,如版本发布。
而分公司是项目正在下降一个特定的路径,从而分支标记你的进步。 当你做到了,合并/删除分支(即标记)。 当然,在这一点上,你可以选择犯下标签。