“分支”究竟是什么意思?

时间:2014-07-31 20:41:26

标签: git branch terminology

长话短说......

据我所知,“分支”一词(用Git的说法)可能指的是相关但不同的东西:

  1. 提交的非符号引用/指针,
  2. 此类参考的名称(例如“master”),
  3. 存储库的提交DAG的子图,该提交DAG由从这样的引用所指向的提交可到达的所有提交组成。
  4. 然而,我已经看到这个术语过去常常是指除了这三种可能的用法之外的其他内容(下面有更多细节)。在Git上下文中,我的列表中缺少的“分支”一词是否还有其他有效和明确的用法?

    更多细节

    使用Git大约一年后,我正在为CS学生准备一个简短的教程。我真的想要确定Git术语,以免造成任何混淆。

    当然,我一直在使用Git分支机构一段时间了;我很习惯使用它们并且发现Git分支模型很棒。但是,我仍然发现术语“分支”有问题且含糊不清,因为它似乎至少引用了两个不同的东西,具体取决于它使用的上下文...有时甚至在同一个教程/手册中。

    用法1:branch =指向提交

    的指针/引用

    Pro Git书(在3.1 - What a branch is中),显示下图后,

    enter image description here

    继续将分支定义为

      

    只是一个指向其中一个提交的轻量级可移动指针。

    据我所知,这也是Git手册页中“分支”的含义。

    我对这个定义非常满意。我认为分支只是指向DAG中特定提交的引用,而分支的“提示提交”是该引用指向的提交。到现在为止还挺好。但是等等......

    用法2:branch = DAG的子图

    Atlassian Git tutorial引入了如下分支:

      

    分支代表一条独立的发展路线。

    我猜这是什么意思,是一系列提交。让我改进一下这个想法......唯一对我有意义的解释是术语“分支”也可以指存储库的提交DAG的子图,该提交DAG由提交的提示提交的所有提交组成

    但是,Pro Git书籍也包含以下图表(见3.4 - Branching workflows),

    enter image description here

    这似乎与我的解释相矛盾,因为它似乎意味着只有提交C2 - C5(不是C1)属于develop分支,并且只有提交C6 - C7(不是C1 - C5)属于topic分支。

    我发现这种用法含糊不清,因为如果我在那个阶段绘制DAG,而不知道分支引用在过去指向的位置,并且没有任何假设三个分支之间的任何层次结构,那么我会得到的是

    enter image description here

    我还发现其他Git学习资源中的一些图表令人困惑。特别考虑以下内容(取自Lynda.com - Git Essential Training的介绍视频):

    enter image description here

    此处,master的提示实际上 534deHEAD指向master),但“主人的位置“图上的标签非常具有误导性。在这种情况下,该标签应该描述的内容对我来说还不清楚......

    修改:我发现了这个excellent post on Marc's blog; 分支部分回应了我上面的评论。

2 个答案:

答案 0 :(得分:9)

你是对的。

我们可以通过分离" local"进一步拆分您的第1项和#34;远程"分支标签:本地分支(本地标签)是使用refs/heads/启动(内部 - 许多前端命令隐藏此项)的名称,而#34;远程分支" - 也称为"远程跟踪分支" -start with refs/remotes/然后在命名分支的部分之前有一个路径组件命名特定的远程。 (编辑,2018年4月:我不喜欢短语"远程分支"或"远程跟踪分支&#34 ;;我认为最好只是打电话这些远程跟踪名称。但是有很多现有文档使用其他两个短语,因此我们需要了解这种用法​​。)

例如,您无疑熟悉refs/remotes/origin/master,但如果您有一个名为bob的遥控器,您可能还会refs/remotes/bob/hacks/feep跟踪Bob hacks/feep }。

本地分支机构名称refs/heads/branch具有git checkout将为您提供的区别特征""默认情况下,该分支通过将该名称写入特殊的HEAD引用;一旦你以这种方式设置,新的提交(由git commitgit mergegit cherry-pick等创建)会导致新提交的SHA-1被写入进入分支文件。 (新提交作为其父级或其父级之一,是旧的分支提示。)

我试图使用" branch tip"等词语。具体表示分支名称如refs/heads/master指向的提交,"分支名称"或者"当地分支机构名称"引用名称本身(是否以refs/heads/为前缀),并且 - 我认为这是最不成功的 - "分支结构"引用DAG子集。但是,给定一个带有fork-and-merge的DAG,如下所示:

         o--o
        /    \
...-o--o      o--o-...
        \    /
         o--o

我有时想把小苯环状物体的一半或另一半称为"分支"同样,我对此没有什么好处。

(顺便说一下,如果你是一名拓扑学家,Atlassian图也可以线性绘制的事实不会打扰你。但是,正如老笑话所说,拓扑学家一直试图从他们的甜甜圈中喝酒并吃掉他们的咖啡杯因为每一个都只是一个圆环。)

答案 1 :(得分:5)

在第二种情况下,我们的意思是"来自提交的reachable的提交由分支指向"。

在Pro Git示例中,假设topic分支指向提交C7,该分支包含提交C7C6C5,{{ 1}},C4C3C2。没有其他概念承诺正在" on"在Git中这是一个分支,你是正确的,你可以线性重绘DAG。

Lynda.com的图表非常不清楚,我怀疑你是对的,因为它有误导性。