长话短说。
据我所知,术语“分支”(在Git中)可能指的是相关但不同的事物:
然而,我看到这个术语显然指的是除了这三种可能的用法之外的其他东西(下面有更多详细信息)。在Git上下文中,我上面的列表中还缺少术语“分支”的其他有效且明确的用法吗?
更多细节
在使用Git大约一年之后,我正在为CS学生准备一个简短的教程。我真的很想明确Git的术语,以避免任何混淆。
当然,我使用Git分支已经有一段时间了;我觉得使用它们很舒服,而且发现Git分支模型很棒。然而,我仍然发现术语“分支”有问题和含糊不清,因为它似乎指的是至少两个不同的东西,这取决于它使用的上下文...有时甚至在同一教程/手册中。
用法1: branch =提交的指针/引用
Pro Git书(3.1 - What a branch is格式),在显示了下面的图表后,
继续将分支定义为
只是指向其中一个提交的轻量级可移动指针。
据我所知,这也是Git手册页中“分支”的含义。
我对这个定义非常满意。我认为分支仅仅是指向DAG中特定提交的引用,分支的“提示提交”就是该引用所指向的提交。到现在为止还好。等等..。
用法2:分支= DAG的子图
Atlassian Git tutorial按如下方式引入分支:
分支代表一条独立的开发路线。
他们的意思是,我猜,是一串提交。让我来提炼一下这个想法。对我来说唯一有意义的解释是,术语“分支”也可以指代存储库的提交DAG的子图,该子图由从tip commit考虑的可到达的所有提交组成。
然而,例如,Pro Git书也包含以下图表(参见3.4 - Branching workflows)。
这似乎与我的解释相矛盾,因为这似乎意味着只有提交C2
-C5
(而不是C1
)属于develop
分支,并且只提交C6
-C7
(而不是C1
-C5
)属于topic
分支。
我发现这种用法不明确和模糊,因为如果我在那个阶段绘制DAG,而不知道分支引用在过去所指向的位置,也不假设三个分支之间有任何层次结构,那么我得到的结果就是
我还发现其他Git学习资源中的一些图表令人困惑。请特别考虑以下内容(取自Lynda.com - Git Essential Training的介绍视频):
在这里,master
的提示实际上是534de
( HEAD
指向master
),但是“主”标签在图中的位置非常容易误导。在这种情况下,这个标签应该描述的是什么,我不清楚...
编辑分支:我后来找到了这个分支;分支部分呼应了我上面的评论。
发布于 2014-08-01 17:04:14
你是对的。
我们可以通过分离“本地”和“远程”分支标签来进一步拆分您的项目1:本地分支(本地标签)是以refs/heads/
开头(在内部-许多前端命令将其隐藏)的名称,而“远程分支”-which也称为带有refs/remotes/
的“远程跟踪分支”-start,然后在命名分支的部分之前有一个路径组件命名特定的远程。(编辑,2018年4月:我不喜欢“远程分支”或“远程跟踪分支”这个短语;我认为只调用这些远程跟踪名称会更好。但是有很多现有的文档使用了另外两个短语,所以我们需要注意这种用法。)
例如,您无疑熟悉refs/remotes/origin/master
,但是如果您有一个名为bob
的遥控器,那么您也可能拥有跟踪Bob的hacks/feep
的refs/remotes/bob/hacks/feep
。
名为refs/heads/branch
的本地分支具有一个与众不同的特性,即git checkout
会默认将您“放在”该分支上,方法是将该名称写入特殊的HEAD
引用;一旦以这种方式设置它,就会出现新的提交(由git commit
、git merge
、git cherry-pick
等创建)。将新提交的SHA-1写入到分支文件中。(新的提交将旧的分支尖端作为其父级或父级之一。)
我尝试使用诸如“分支提示”之类的术语来明确地表示诸如refs/heads/master
之类的分支名称所指向的提交,使用“分支名称”或“本地分支名称”来引用名称本身(无论是否以refs/heads/
作为前缀),并且-我认为这是最不成功的-“分支结构”来引用refs/heads/
子集。然而,假设一个DAG具有如下的分叉和合并:
o--o
/ \
...-o--o o--o-...
\ /
o--o
有时,我想把这个小苯环状物体的一个或另一半也称为“分支”,但我对此并没有真正合适的术语。
(顺便说一句,如果您是一名拓扑学家,Atlassian图也可以线性绘制,这一事实不会困扰您。然而,正如一个古老的笑话所说,拓扑学家们一直试图从他们的甜甜圈中喝水,吃他们的咖啡杯,因为每个杯子都只是一个环面。)
发布于 2014-08-01 05:15:52
在第二种情况下,我们指的是“从分支指向的提交中出来的提交”。
在Pro示例中,假设topic
分支指向提交C7
,该分支包含提交C7
、C6
、C5
、C4
、C3
、C2
和C1
。在Git中,除了这一点,没有其他关于提交是“在”分支上的概念,你可以线性地重新绘制DAG,这是正确的。
Lynda.com图表非常不清楚,我怀疑您是对的,它具有误导性。
https://stackoverflow.com/questions/25068543
复制相似问题