显示子分支的所有分支历史记录

时间:2017-11-24 13:11:18

标签: git branch

我正在寻找一种在远程(使用git)可视化所有分支的方法,就像在此图像上一样,即使某些分支没有任何提交。 enter image description here

但是当我运行gitk命令时,我得到了这样的东西:

enter image description here

在这个图像上,看起来master是dev的子节点,并且功能分支在同一级别上,如果master没有提交,那么看起来好像master和dev是相同的分支。

有没有办法以更清晰的方式显示分支历史记录?我找到的所有解决方案都给出了与gitk相同的结果。

1 个答案:

答案 0 :(得分:2)

更新 - 最后添加了一些注释,因为评论显示更多信息可能有所帮助。

问题在于你是否试图将概念强加给git中不存在的git。

没有#34;分支没有提交"。提交不属于分支"。分支机构不是"孩子"另一个分支。没有任何工具可以查看存储库,并根据其中的信息绘制与这些概念对应的直观图形,因为这些概念不会在回购中保存的信息中找到。

在git中,分支是一种ref。 ref是指向提交的指针。

当你说'#34;分支没有提交"时,你的意思是"有人在分支a上创建了一个新的分支b;但是在分支b"上没有人承诺。 git并不知道发生的事情; git知道的是b的分支引用指向可以从a到达的提交。在许多情况下,这意味着ba指向相同的提交。

您想要的图表类型的概念是每个提交都可以唯一地分配给分支。在git中,提交可以从任何给定的ref到达,也可以从任何给定的ref无法访问。 (Reachable意味着您可以通过首先查看ref指向的提交,然后可能跟随提交的父指针来查找提交。)因此,可以同时从许多分支到达提交。通常" root"可以从所有分支到达提交。如果您在分支a上并且创建了分支b,那么从分支a可以访问的所有提交也可以从分支b到达。

当你想到一个分支b作为一个"孩子"另一个分支a,你的意思是有人在a创建b时。这不是git跟踪的东西。无法确定a是从b创建的,还是b是从a创建的,还是创建了ab来自其他一些分支。

如果严格按照一组约定来分支和合并,那么你可以想象创建一个解释分支/提交拓扑的工具,假设这些约定产生你想要的东西。这有多大可能取决于认为你永远不会违反你的约定的现实程度。我不知道任何这样的工具,因为它们会对虚构的概念起作用,对于git并不重要,我不确定它在实践中是否有用。

您的示例图形成了一个描述特定分支实践的文档。这种做法强加了一些概念(如子分支),因此使用该类型的图表来描述该实践的理想是有意义的。但是在一个真正的回购中,事实并非如此。

此处更新

在评论中,您提到您无法告知给定提交的分支。一般来说这是正确的,因为这不是git中跟踪的东西。您可以从哪个分支可以判断提交是否可访问,因为所有git都知道 - 而有时允许您推断它在哪个分支上创建。

但你提到没有看到分支之间的分离,这让我思考。在您的gitk图表中,只有并非分支之间的分离。并且可能是因为使用"快进"合并,无论好坏,都是git的默认行为,即使它可能非常混乱。

假设我开始使用只有一次提交的回购,以及masterdev分支。

X <--(master)(dev)

现在,我开始研究开发分支。我创建了一些提交。

X <--(master)
 \
  A -- B -- C <--(dev)

现在,我合并为主人。默认情况下,只需将master引用更新为指向C,git就会看到它可以采用快捷方式。这被称为快进。

X -- A -- B -- C <--(dev)(master)

如果我们只考虑当前&#34;当前&#34;在master上,此快捷方式为我们提供了正确的结果。但是有些关于历史的事实已经丢失。我们可以阻止这种情况,而不仅仅是说git merge dev,我们说

git merge --no-ff dev

如果您使用的分支策略赋予分支拓扑意义,那么在合并时几乎总是应该使用--no-ff。这会产生

X ----------- M<--(master)
 \           /
  A -- B -- C <--(dev)

并且您在gitk中看到的图表可能会更适合您(尽管它仍然看起来与您在参考的图表中看到的非常相似)。