【发布时间】:2026-01-29 22:25:01
【问题描述】:
长话短说……
据我所知,术语“分支”(在 Git 用语中)可能指相关但不同的事物:
- 指向提交的非符号引用/指针,
- 此类引用的名称(例如“master”),
- 存储库提交 DAG 的子图,由此类引用指向的提交可到达的所有提交组成。
但是,我已经看到该术语显然用于指代这三种可能用法之外的其他内容(更多详细信息见下文)。在 Git 上下文中,我上面的列表中缺少“分支”一词的其他有效且明确的用法吗?
更多详情
在使用 Git 大约一年后,我正在为 CS 学生准备一个简短的教程。我真的很想确定 Git 术语,以免造成任何混淆。
当然,我使用 Git 分支已经有一段时间了;我很乐意使用它们,并且发现 Git 分支模型很棒。但是,我仍然觉得“分支”这个词有问题且模棱两可,因为它似乎至少指代两种不同的事物,具体取决于使用它的上下文……有时甚至在同一个教程/手册中。
用法 1:分支 = 指向提交的指针/引用
Pro Git 书(3.1 - What a branch is),展示下图后,
继续定义一个分支为
只是一个指向这些提交之一的轻量级可移动指针。
据我所知,这也是 Git 手册页中“分支”的含义。
我对这个定义非常满意。我认为分支只是指向 DAG 中特定提交的引用,分支的“提示提交”是该引用指向的提交。到目前为止,一切都很好。但是等等……
用法 2:分支 = DAG 的子图
Atlassian Git tutorial 引入分支如下:
一个分支代表一个独立的发展路线。
我猜他们的意思是一串提交。让我完善一下这个想法……对我来说唯一有意义的解释是,术语“分支”也可以指代存储库提交 DAG 的 子图,该子图由所考虑的提示提交可到达的所有提交组成强>。
但是,例如,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),但是图中“master”标签的位置非常容易误导.在这种情况下,该标签应该描述什么我不清楚......
编辑:我已经找到了这个excellent post on Marc's blog; Branches 部分与我上面的评论相呼应。
【问题讨论】:
-
这是我读过的关于 git 的最有用的问题。我什至在阅读答案之前就学到了一些东西。干得好。
-
术语“branch”定义为“存储库提交 DAG 的子图,由考虑的提示提交可到达的所有提交组成” 是有问题的,当一个人在可达提交链中遇到合并提交时。突然之间,当我们回顾历史时,我们会称一个分支为可以分裂成几个分支的东西——这可能不是本意。
标签: git branch terminology