Answers:
一个标签代表在某一瞬间的版本一个特定的分支。一个分支代表开发一个单独的线程可以与上相同的代码库等开发工作同时运行。分支的更改最终可能会合并回另一个分支以统一它们。
通常,您会标记一个特定的版本,以便您可以重新创建它,例如,这是我们交付给XYZ Corp的版本。一个分支是一种在特定版本的代码上提供持续更新,同时继续进行开发的策略。您将创建交付版本的分支,继续进行主线开发,但对代表交付版本的分支进行错误修复。最终,您将这些错误修复合并回主行。通常,您会同时使用分支和标记。您将拥有各种标签,这些标签可能会应用于主线及其分支,沿您想要重新创建的每个分支标记特定的版本(例如,交付给客户的版本)-用于交付,错误诊断等。
实际上,它比这要复杂得多-或您想使其复杂得多-但这些示例应该使您对这些区别有所了解。
git checkout 88c9f229f
您可以执行类似的操作,git checkout your_tag
然后检出标记为别名的提交。
从理论上讲:
从技术角度来看:
refs/tags/
名称空间中,并且可以指向标签对象(带注释的和可选的GPG签名标签)或直接提交对象(对于本地名称使用较少的轻量级标签),或者在极少数情况下甚至指向树对象或Blob对象(例如,GPG签名) )。refs/heads/
名称空间中,并且只能指向commit对象。该HEAD
指针必须引用分支(符号引用)或直接连接到一个提交(独立HEAD或无名分支)。refs/remotes/<remote>/
名称空间中,并遵循远程存储库中的普通分支<remote>
。另请参见gitglossary联机帮助页:
科
“分支机构”是积极的发展路线。分支上的最新提交称为该分支的尖端。分支的尖端由分支头引用,随着分支上的其他开发完成,分支头将向前移动。单个git存储库可以跟踪任意数量的分支,但是您的工作树仅与其中一个分支(“当前”或“签出”分支)相关联,并且HEAD指向该分支。
标签
指向标记或提交对象的引用。与头部不同,标签不会因提交而更改。标签(不是标签对象)存储在中
$GIT_DIR/refs/tags/
。[...]。标签最通常用于标记提交祖先链中的特定点。标签对象
一个对象,它包含一个指向另一个对象的ref,它可以像提交对象一样包含一条消息。它还可以包含(PGP)签名,在这种情况下,它称为“签名标签对象”。
git checkout <tag>
”将生成匿名的未命名分支(即所谓的“分离头”)并选择标签状态。创建一个新的提交会在这个未命名的分支上执行它,并且不会更改标记指向的内容。
如果您将存储库视为一本记录项目进展的书...
您可以将分支视为这些粘性书签之一:
全新的存储库只有其中一个(称为master
),该存储库会自动移至您编写的最新页面(请考虑commit)。但是,您可以自由创建和使用更多书签,以便在书中标记其他兴趣点,因此可以快速返回它们。
另外,您始终可以将特定的书签移动到书的其他页面(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的答案所有技术,但是坦率地说,在这一点上,您并不需要所有细节;)
要点是:标签是指向提交的简单指针,您将永远无法修改其内容。您需要一个分支。
对于您而言,每个开发人员都在使用特定功能:
除了直接跟踪同事的分支机构,您还可以跟踪每个人将其工作推送到一个“官方”中央存储库的分支机构,以便集成和共享每个人针对该特定功能的工作。
看起来最好的解释方式是标签充当只读分支。您可以将分支用作标记,但可能会无意中使用新的提交对其进行更新。只要标签存在,就可以保证它们指向同一提交。
git tag -f
。
在Git的比喻解释了如何一个典型的DVCS被创建,为什么它们的创造者做他们做了什么。另外,您可能想看看Git for Computer Scientist;它解释了Git中每种对象的功能,包括分支和标签。