Bia*_*cki 593 git version-control branch git-tag git-branch
我在理解如何在git中使用标签与分支时遇到一些困难.
我刚刚将当前版本的代码从cvs移动到git,现在我将为特定功能处理该代码的子集.其他一些开发人员也会参与其中,但并非所有开发人员都会关注此功能.我应该创建分支还是标记?在什么情况下我应该使用一个与另一个?
Jak*_*ski 515
从理论的角度来看:
从技术角度来看:
refs/tags/
命名空间中,并且可以指向标记对象(带注释的和可选的GPG签名标记)或直接提交对象(较少使用的轻量级标记用于本地名称),或者在极少数情况下指向树对象或blob对象(例如GPG签名) ).refs/heads/
命名空间中,并且只能指向提交对象.该HEAD
指针必须引用分支(符号引用)或直接连接到一个提交(独立HEAD或无名分支).refs/remotes/<remote>/
命名空间中,并遵循远程存储库中的普通分支<remote>
.另见gitglossary联机帮助页:
科
"分支"是一个积极的发展路线.分支上的最新提交称为该分支的提示.分支的尖端由分支头引用,分支头在分支上进行额外的开发时向前移动.单个git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一个分支相关联("当前"或"已检出"分支),HEAD指向该分支.
标签
指向标记或提交对象的ref.与头部相反,标记不会被提交更改.标签(不是标签对象)存储在
$GIT_DIR/refs/tags/
.[...].标记最常用于标记提交祖先链中的特定点.标签对象
包含指向另一个对象的ref的对象,该对象可以包含与提交对象类似的消息.它还可以包含(PGP)签名,在这种情况下,它被称为"签名标记对象".
tva*_*son 496
标签表示某个时刻特定分支的版本.分支代表一个单独的开发线程,可以与同一代码库上的其他开发工作同时运行.对分支的更改最终可能会合并回另一个分支以统一它们.
通常你会标记一个特定的版本,以便你可以重新创建它,例如,这是我们发送给XYZ公司的版本.分支更像是一种策略,可以在特定版本的代码上提供持续更新,同时继续做它的发展.您将创建交付版本的分支,继续在主线上进行开发,但对代表交付版本的分支进行错误修复.最后,您将这些错误修复程序合并回主线.通常你会同时使用分支和标记.您可以使用各种标签,这些标签可以应用于主线及其分支,用于标记您可能要重新创建的每个分支的特定版本(例如,传递给客户的那些版本) - 用于传递,错误诊断等.
它实际上比这更复杂 - 或者像你想要的那样复杂 - 但是这些例子可以让你了解这些差异.
jub*_*0bs 140
如果您认为您的存储库是一本记录您项目进度的书籍......
您可以将分支视为其中一个粘性书签:
一个全新的存储库只有一个(称为master
),它会自动移动到您编写的最新页面(想想提交).但是,您可以自由创建和使用更多书签,以便在书中标记其他兴趣点,以便您可以快速返回.
此外,您始终可以将特定书签移动到书籍的其他页面(git-reset
例如,使用); 兴趣点通常随时间而变化.
您可以将标签视为章节标题.
它可能包含标题(思考注释标签).标签类似但与分支不同,因为它标志着书中的历史兴趣点.为了保持其历史方面,一旦您共享了一个标签(即将其推送到共享遥控器),您就不应该将其移动到书中的其他位置.
Von*_*onC 42
来自CVS的您需要意识到的是,在设置分支时不再创建目录.
不再有"粘性标签"(可以只应用于一个文件)或"分支标签".
分支和标签是Git中的两个不同对象,它们总是适用于所有 repo.
您将不再(使用SVN这次)必须使用以下内容显式构建您的存储库:
branches
myFirstBranch
myProject
mySubDirs
mySecondBranch
...
tags
myFirstTag
myProject
mySubDirs
mySecondTag
...
Run Code Online (Sandbox Code Playgroud)
该结构来自CVS是修订系统而不是版本系统(参见Source control vs. Revision Control?).
这意味着分支通过CVS的标签模拟,SVN的目录副本.
如果您习惯于签出标签,并且开始使用标签,那么您的问题就会有所体现.
你不应该这样;)
标签应该代表一个不可变的内容,仅用于访问它,并保证每次都获得相同的内容.
在Git中,修订历史是一系列提交,形成一个图形.
分支是该图的一条路径
x--x--x--x--x # one branch
\
--y----y # another branch
1.1
^
|
# a tag pointing to a commit
Run Code Online (Sandbox Code Playgroud)
请参阅JakubNarębski对所有技术细节的回答,但坦率地说,此时,您不需要(还)所有细节;)
重点是:标记是提交的简单指针,您永远无法修改其内容.你需要一个分支.
在您的情况下,每个开发人员都在处理特定功能:
您可以只跟踪一个"官方"中央存储库的分支,而不是直接跟踪同事的分支,每个人都推动他/她的工作,以便集成和共享每个人为这个特定功能工作的工作.
小智 16
看起来最好的解释方式是标签作为只读分支.您可以将分支用作标记,但可能会无意中使用新提交更新它.只要它们存在,标签就保证指向相同的提交.
Bom*_*mbe 10
在Git的比喻解释了如何一个典型的DVCS被创建,为什么它们的创造者做他们做了什么.另外,你可能想看看Git for Computer Scientist ; 它解释了Git中每种类型的对象的作用,包括分支和标记.
我喜欢将分支机构视为您要去的地方,将标签视为您去过的地方。
标签感觉就像是过去某个特定要点的书签,例如版本发布。
分支是项目的特定路径,因此分支标记随您而前进。完成后,您将合并/删除分支(即标记)。当然,此时您可以选择标记该提交。
归档时间: |
|
查看次数: |
195829 次 |
最近记录: |