为什么Git分支图不能正确地追踪分支?

6
下面的截图来自SourceTree。我创建了一个简单的git repo,并进行了几次提交。每个提交的注释都说明了我在提交时所在的分支。
如您所见,树形图(可以说)不够优化,因为提交到主分支的提交并不是全部相同的颜色,也不在单一的车道上。这是为什么呢?
(GitHub和BitBucket绘制的树形图似乎存在类似的问题,所以这不仅仅是SourceTree的问题。)
显然,在这个简单的例子中并不重要,但在我的一些项目中,我们使用git-flow的变体,当你看树形图时,往往难以跟踪每个git-flow“泳道”。部分原因是树状图不能使每个泳道随时间保持相同的颜色。
我怀疑树形图(可以说)不够优化,是因为git repo实际上没有足够的信息来按我想要的方式绘制树形图。特别地,当两个提交是共同提交的子级时(例如,当您创建分支时),git不知道父提交是与子1还是与子2“在同一分支”上。换句话说,它不知道哪个子级是分支,哪个是主干的延续。我理解得对吗?

提交到主分支的 所有 提交都在同一条“车道”上:该车道在提交 94f458e 处从蓝色变为紫色。至于为什么它们是不同的颜色,这更多是一个源代码问题,而非 Stack Overflow 的问题。也许开发人员选择将通向最新提交的路径视为无需分支的路径?基于路径名称提交功能请求以进行更改。 - Paul Hicks
当我说“lane”时,我的意思是“column”。我希望的是,所有提交到主分支的都在一个列中,而提交到发布分支的则在另一个列中。我的意思是,如果你给一个人DAG、分支指针和提交列,他们可能不会像上面那样绘制树形图。 - Adam L. Taylor
虽然 Git 并不要求用户提供足够的信息来绘制正确的泳道图,但在许多情况下,通过使用提交消息作为提示,可以推断出更好的绘图。例如,合并消息通常以“将分支 'B' 合并到 A”开头;在这种情况下,很明显源分支的名称应该是什么,以便于泳道的目的。用户可以轻松地增加更多的清晰度;例如,每当我创建一个分支时,我都会在其中放置一个初始的空提交“从 'A' 创建分支 'B'”。图形绘制程序可以通过采用这些提示来做得更好。 - Don Hatch
3个回答

4
如其他答案所提到的那样,这就是Git本身的特点:git commit中不包含该提交创建时用户所处分支的任何信息。(而且这些信息也无法从Git维护的信息(当然包括DAG)中可靠推断出来。) 这是Git作者所做的设计选择。相比之下,Mercurial存储了每个提交的分支名称。Git的支持者认为这是一件坏事,因为它会阻止创建可能是暂时的分支来尝试各种操作,此外,分支名称冲突很容易发生。请参阅《Mercurial和Git之间的区别》
Mercurial的支持者则认为将每个提交的分支名称存储在其中是一件好事,因为它可以更轻松地维护一个可解释的历史记录。正是由于Mercurial将每个提交的分支名称存储在其中,这似乎是为什么我比Git更喜欢Mercurial的原因作者更喜欢Mercurial过Git的主要原因。

Mercurial在每个提交中存储分支名称,如果使用Mercurial的命名分支。或者,如果想要类似于Git的行为,则可以使用Mercurial的书签。 - Sampo Smolander

3
在git中,“分支”被实现为指向更改集的指针。
这意味着,特定的更改集可以同时“属于”多个分支。
也就是说,它在运行时被解决,在删除分支(或以任何其他方式修改图形)后,您无法确定它最初提交到哪个分支。
在您的情况下,94f458e更改集确实属于master和release,因此图形是完全正确的。

1
听起来你基本上同意我在问题的最后一段写的内容。只是你不认为git当前的行为比它可能的行为要少用。在这一点上,我不同意:我可以想象一个假设的版本控制系统,它保留了git目前抛弃的信息,我可以想象这些信息在某些情况下是有用的。比如,就像这个例子。 - Adam L. Taylor
抱歉如果我听起来有点不同意。我真的很感激你花时间回答问题! - Adam L. Taylor
@Adam L. Taylor:好的,Git不会跟踪提交更改集的分支信息,而Mercurial会。 - zerkms
啊,谢谢,我不知道Mercurial的这个。 - Adam L. Taylor

0

提交并不在分支上。分支只是本地方便命名的提交,它们与您感兴趣的提交无关。重要的是您存储库中历史记录的结构。专注于这一点。提交94f18d都是两个分支历史记录的一部分,它们是提交releasemaster所引用的祖先。

如果您的实用程序将master绘制在左侧,则其提交将以蓝色绘制,并且所有唯一属于release祖先的提交将以品红色绘制。

这基本上就是@zerkms所说的(我赞同他的观点),只是从不同的角度来看。


如果您的实用程序在左侧绘制了主分支,那么它的提交将以蓝色绘制,并且所有独特于发布祖先的提交将以洋红色绘制。是的,这正是我想要的绘图方式。而且似乎可以说是Git的设计缺陷,它没有保留足够的信息来绘制我想要的树形结构。 - Adam L. Taylor
事实证明,如果你不再认为“分支”是某种重量级的抽象概念,而是将分支名称视为存储库提交图中可移动的标签,那么你可以获得相当大的收益。提交本身只是提交。 - jthill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接