首页 > 解决方案 > git - 如何判断提交属于哪个分支?

问题描述

作为一个对 Git 比较陌生的人,我最近(也是终于!)了解到分支实际上只是指向特定提交的指针,有时将“提交属于哪个分支”改写为“来自哪个分支”可能会更好。分支是可访问的提交”。

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

具有两个分支的 git 树:master 和 iss53

在这张图片中,我直观地认为提交C4“属于”分支master并且提交C3C5属于iss53. 但是C0通过C2呢?他们会属于两个分支吗?或者我必须说它们可以通过分支机构“到达”masteriss53

一旦我合并iss53到,这会变得更加复杂master

带有分支 iss53 的 git 树合并到 master

由于分支iss53被合并到master,这是否使提交C0通过C2属于master“更多” iss53

如果我在合并后删除分支怎么办?iss53哪个分支会提交C3C5属于哪个分支?再想一想,似乎合并后,commits C4, C3, 和C5就分支历史而言是“相等的”,我无法分辨它们三个属于哪个分支。这是因为删除后,除了和之外iss53,似乎没有任何关于是否C4属于任何历史分支的信息。C3C5

我找到了这个答案,它说最好从“可以从哪些分支到达这个提交”的角度来考虑这个问题。但这是否意味着C4,C3C5都可以从master分支到达???但是您如何处理图中发生的分支父系?这有关系吗?

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

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

PS 源于这篇文章的一个边/题外问题是:提交可以有两个以上的父母吗?

标签: gitversion-controlgit-branch

解决方案


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

提交存在于许多分支中。

提交也可以根本不存在于任何分支中。

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

但这是否意味着 C4、C3 和 C5 都可以从 master 分支访问?

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

你如何处理图中发生的分支父系?这有关系吗?

提交C6有两个父母。这意味着两个分支合并在一起。这就是你处理“分支亲子关系”的方式。具有多个父级的提交是用git mergeor git pullgit fetch后面是 a git merge)创建的。


推荐阅读