【发布时间】:2020-11-18 06:24:48
【问题描述】:
作为一个对 Git 比较陌生的人,我最近(也是终于!)了解到分支实际上只是指向特定提交的指针,有时将“提交所属的分支”改写为“从哪些分支是可到达的提交”。
例如下图来自Git官方文档:
在这张图片中,我直观地认为提交C4“属于”分支master,提交C3和C5属于iss53。但是C0 到C2 呢?他们会属于两个分支吗?或者我必须说它们可以通过master 和iss53 分支“到达”吗?
一旦我将iss53 合并到master 中,这将变得更加复杂:
由于分支iss53 被合并到master,这是否使提交C0 到C2 属于master “更多”而不是iss53?
如果我在合并后删除分支iss53怎么办?提交C3 和C5 属于哪个分支?仔细考虑之后,似乎合并后,提交C4、C3和C5在分支历史方面是“相等的”,我无法判断它们三个属于哪个分支.这是因为删除iss53 后,除了C3 和C5 之外,似乎没有任何关于C4 是否属于任何历史分支的信息。
我找到了this answer,它说最好从“可以从哪些分支到达此提交”的角度来考虑这一点。但这是否意味着C4、C3 和C5 都可以从master 分支访问???但是您如何处理图中发生的分支父系?这有关系吗?
另外,我链接到的答案指出,可能存在任何分支都无法到达提交的情况, 怎么会发生?它的含义是什么?
但我的主要问题仍然存在:如何将提交与分支关联?
附:来自这篇文章的一个边/题外问题是:一次提交可以有两个以上的父母吗?
【问题讨论】:
-
是的,一个提交可以有两个以上的父级。
-
正如所写,我很想将其称为“不清楚你在问什么”。您问了很多澄清问题,所有这些问题都与您的标题问题不同。您链接到的问题似乎准确地回答了它。我认为您遇到的困惑是,在上一张图中,所有提交都在 master 中(或者 master 可以访问)。另外,看看 octopus merge for 2 个以上的父母。
-
@TTT:感谢您的批评。我必须承认学习分支对我来说是一个令人困惑的过程,如果我的问题不清楚,我很抱歉。我认为我想问的是,在我在帖子中提到的无数情况下,您如何看待提交和分支之间的关系?我想更具体,但我承认这对我来说很难。如果您能提出更好的方法来做到这一点,我会全力以赴。
-
这是有道理的。了解 DAG 需要一些时间来适应(请参阅 torek 的回答)。请注意,您的编辑询问了孤立提交是如何可能的,正如 Greg Burghardt 所描述的那样 - 例如如果一个提交只能由一个分支访问并且该分支被删除,则该提交是孤立的,最终将被垃圾收集,除非有其他东西指向它(如标签或 reflog 条目 - 返回 torek 的答案)。
-
顺便说一句,要回答你的标题问题,重要的是要意识到措辞实际上应该是“如何判断提交属于哪个分支?”更多信息在这里:stackoverflow.com/q/2706797/184546
标签: git version-control git-branch