git - 如何判断提交属于哪个分支?

git - How to tell which branch a commit belongs to?

作为 Git 的新手,我最近(终于!)了解到分支实际上只是指向特定提交的指针,有时改写“哪个分支提交属于”作为“提交可从哪个分支到达”。

例如下图来自Git官方文档:

在这张图片中,我直觉上认为提交 C4 “属于”分支 master 并且提交 C3C5 属于 iss53.但是 C0C2 呢?他们会属于两个分支吗?或者我必须说它们可以被分支机构 masteriss53“访问”?

一旦我将 iss53 合并到 master:

中,这会变得更加复杂

自从分支 iss53 合并到 master 后,这是否使 C0C2 的提交属于 master 比 [=15]“更多” =]?

如果我在合并后 删除 分支 iss53 怎么办? C3C5 属于哪个分支?想多了,似乎合并后,提交C4C3C5在分支历史上是“平等​​的”,我分不清是哪个分支他们三个属于。这是因为删除iss53后,除了C3C5,似乎没有任何关于C4是否属于任何历史分支的信息。

我发现 说最好从“从哪个分支可以到达这个提交”的角度来考虑这个问题。但这是否意味着 C4C3C5 都可以从 master 分支到达???但是你如何处理图中发生的分支父系呢?这重要吗?

此外,我链接到的答案指出,可能存在任何分支都无法到达提交的情况, 怎么会发生?它的含义是什么?

但我的主要问题仍然存在:如何将提交与分支相关联?

P.S。 side/off-topic 源于此 post 的问题将是:一个提交能否有两个以上的父项

提交不属于分支。没有所有权。分支是指向提交的指针。每个提交都有一个或多个父提交。当多个分支合并在一起时,追溯一个分支的历史不仅仅是一条直线。您需要重新调整您对提交和分支的看法。

提交在许多分支中存在

提交也可以存在于根本没有分支中。

从概念上讲,Git 存储库只是一个大链表,其中每个节点至少指向一个其他节点。 “分支”只是指向其中一个节点的标记。 Git 中的节点称为提交。删除 Git 中的分支只会删除指向提交的指针,但不会删除提交对象本身。你可以 recover branches you accidentally deleted,因为提交的数据库被排列成一个链表,分支只是一个指针——一个书签,如果你愿意的话。

But does that mean C4, C3, and C5 are all reachable from the master branch?

是的,就是这个意思。所有这些提交都是可访问的,因为提交 C6 指向 2 个不同的提交:C5 C4.

how do you handle the branching parentage that happens in the diagram? Does that matter?

提交 C6 有两个父项。这意味着两个分支合并在一起。这就是您处理“分支出身”的方式。使用 git mergegit pull(即 git fetch 后跟 git merge)创建与多个父项的提交。

添加到reachability确实是这里的关键概念。 提交图,带有哈希 ID 和箭头,可以说是最重要的和最终的。 分支名称 只是给你——和 Git——一个简单的入口点 进入 图表(但请参阅 git gc下一段)。

提交图采用有向无环图或 DAG 的形式。整个系统要求提交可以从 some 外部名称访问——分支名称可以,但标签名称也可以,甚至 Git reflog entry——保持提交“有效”。维护程序 git gc 将在被询问时搜索整个提交数据库,查找无法从任何外部名称访问的提交,并从图表中 p运行e 它们。提交 are 可从名称访问,或从本身可从名称访问的提交,保留在图中。向图中添加新提交的命令通常以 运行ning git gc --auto 结尾,这告诉 git gc 稍微四处看看,猜测此时这种维护是否明智,如果所以,进行维护 运行.

Git 的其他部分将在必要和适当的时候进行图形遍历。例如,git log 命令执行一个操作,从一些给定的提交开始并使用 DAG。图形遍历使用队列(许多图形遍历算法所做的那样)并跟踪访问过的提交,因此它可以访问每个提交一次,即使有多种方法可以访问它。