长话短说...
据我所知,术语"分支"(用Git的说法)可能指的是相关但不同的东西:
提交的非符号引用/指针,
这种参考的名称(例如"主"),
存储库的提交DAG的子图由这样的引用所指向的提交中可到达的所有提交组成。
但是,我已经看到这个术语过去常常是指三种可能的用法以外的东西(下面有更多细节)。在Git上下文中,我的列表中缺少的"分支"一词是否还有其他有效和明确的用法?
更多细节
使用Git大约一年后,我正在为CS学生准备一个简短的教程。我真的想要确定Git术语,以避免任何混淆。
当然,我现在已经使用Git分支了一段时间;我很习惯使用它们并且发现Git分支模型很棒。但是,我仍然发现术语"分支"有问题且含糊不清,因为它似乎至少引用了两个不同的东西,具体取决于它所使用的上下文...有时甚至在同一个教程/手册中。
用法1:branch =指向提交的指针/引用
Pro Git书(3.1中 - 分支是什么),在显示下图后,
继续将分支定义为
simply a lightweight movable pointer to one of these commits.
据我所知,这也是Git手册页中"分支"的含义。
我对这个定义非常满意。我认为分支只是指向DAG中特定提交的引用,而分支的"提示提交"是该引用指向的提交。到现在为止还挺好。可是等等...
用法2:branch = DAG的子图
Atlassian Git教程介绍了如下分支:
A branch represents an independent line of development.
我猜他们的意思是一串提交。让我改进一下这个想法......唯一对我有意义的解释是术语"分支"也可以指存储库的提交DAG的子图,该提交DAG由所考虑的提示提交可到达的所有提交组成。
但是,Pro Git书籍也包含以下图表(参见3.4 - 分支工作流程),
这似乎与我的解释相矛盾,因为它似乎暗示只有提交C2 - C5(不是C1)属于develop分支,并且只提交C6 - C7(不是< x2> - C5)属于topic分支。
我发现这种用法含糊不清,因为如果我在那个阶段绘制DAG,而不知道分支引用在过去指向的位置,并且没有任何假设三个分支之间的任何层次结构,我会得到的是
我还发现其他Git学习资源中的一些图表令人困惑。特别考虑以下内容(取自Lynda.com的介绍视频 - Git Essential Training):
这里,master的尖端实际上是534de(并且HEAD指向master),但图中"主"标签的位置非常误导。在这种情况下,该标签应该描述的是我不清楚的......
编辑:我已经在Marc的博客上找到了这篇优秀的帖子;分支部分回应了我上面的评论。
-
这是我读过的关于git的最有用的问题。 在阅读答案之前我学到了一些东西。 做得好。
你是对的。
我们可以通过分离"本地"和"远程"分支标签来进一步拆分项目1:本地分支(本地标签)是使用refs/heads/启动(内部 - 许多前端命令隐藏此项)的名称,而"远程分支" - 它也被称为"远程跟踪分支" - 用refs/remotes/启动,然后在命名分支的部分之前有一个路径组件命名特定的远程。 (编辑,2018年4月:我不喜欢短语"远程分支"或"远程跟踪分支";我认为最好只调用这些远程跟踪名称。但是有很多现有文档使用其他两个短语,所以我们需要了解这种用法??。)
例如,您无疑熟悉refs/remotes/origin/master,但如果您有一个名为bob的遥控器,您可能还有refs/remotes/bob/hacks/feep跟踪Bob的hacks/feep。
本地分支名称refs/heads/branch具有区别特征,git checkout默认情况下会将您"放在"该分支上,方法是将该名称写入特殊的HEAD引用;一旦你以这种方式设置,新的提交(由git commit,git merge,git cherry-pick等创建)会导致新提交的SHA-1被写入分支文件。 (新提交作为其父级或其父级之一,具有旧的分支提示。)
我试图使用像"branch tip"这样的术语来明确表示像refs/heads/master这样的分支名称,"分支名称"或"本地分支名称"的提交,以引用名称本身(是否以refs/heads/为前缀)或者 - 并且 - 我认为这是最不成功的 -"分支结构"来引用DAG子集。但是,给定一个带有fork-and-merge的DAG,如下所示:
1 2 3 4 5
| o--o
/ \
...-o--o o--o-...
\ /
o--o |
我有时想将小苯环状物体中的一半或另一半称为"分支",我对此没有什么好处。
(顺便提一下,如果你是一名拓扑学家,Atlassian图也可以线性绘制的事实不会打扰你。但是,正如老笑话所说的那样,拓扑学家们不断尝试从他们的甜甜圈中喝水,并且每次吃掉他们的咖啡杯只是一个圆环。)
-
我应该在我的问题中提到本地和远程分支之间的区别;谢谢你补充一下。我也对术语"分支"(或"分支结构")引用DAG子集感到不舒服。严格地说,从图论的角度来看,术语"分支"仅在所考虑的图是树的情况下有效;但是,Git提交DAG不一定是树。
-
虽然我也不喜欢"分支结构",但我向你努力区分"分支尖","分支名称"和"分支结构"致敬。我想我也会在我的教程中做出区分。
-
如果你想出一个更好的术语(graphlet?graph chunk?)让我知道,我可能会开始自己使用它。 :-)
-
"分支历史"怎么样?但是,这可能会误解为分支引用在过去指向的位置(即分支的reflog的内容)。
-
嗯,是的,"分支历史"听起来就像你在谈论git的reflogs。
-
"分支祖先"可能不那么模棱两可,但似乎并不普遍(谷歌在撰写本报告时只报道了1300个左右的"git"分支祖先')。
-
它具有技术优势,因为我们正在查看提交节点的祖先/后代关系。虽然"DAGlet"具有简单和有趣的说法的可疑优势。我想知道它是否能很好地将它描述为"分支祖先",指向父/子关系,然后在此之后开始使用"DAGlet":-)
-
你写道:我不喜欢短语"远程分支"或"远程跟踪分支";我认为最好只叫这些远程跟踪名称[原文如此] ......我很困惑。你更喜欢"远程跟踪分支"到"远程分支"(就像我一样)吗?
-
@ jub0bs:我现在更喜欢远程跟踪名称,即完全删除"分支"这个词。我希望有一个"分支名称"的短语,它根本没有使用"分支"这个词:-)
在第二种情况下,我们指的是"从分支指向的提交可以访问的提交"。
在Pro Git示例中,假设topic分支指向提交C7,该分支包含提交C7,C6,C5,C4,C3,C2和。在Git中没有其他概念提交在"分支"上,而你是正确的,你可以线性地重绘DAG。
Lynda.com的图表非常不清楚,我怀疑你是对的,这是误导性的。
-
非常感谢您关于"像Git一样思考"教程的链接 - 我见过git的最有用的参考资料,以及该网站的参考部分。
-
@Wildcard,我很高兴你发现它很有帮助。这也是我最喜欢的Git引用之一。