我正在寻找一种在远程(使用git)可视化所有分支的方法,就像在此图像上一样,即使某些分支没有任何提交。
但是当我运行gitk命令时,我得到了这样的东西:
在这个图像上,看起来master是dev的子节点,并且功能分支在同一级别上,如果master没有提交,那么看起来好像master和dev是相同的分支。
有没有办法以更清晰的方式显示分支历史记录?我找到的所有解决方案都给出了与gitk相同的结果。
答案 0 :(得分:2)
更新 - 最后添加了一些注释,因为评论显示更多信息可能有所帮助。
问题在于你是否试图将概念强加给git中不存在的git。
没有#34;分支没有提交"。提交不属于分支"。分支机构不是"孩子"另一个分支。没有任何工具可以查看存储库,并根据其中的信息绘制与这些概念对应的直观图形,因为这些概念不会在回购中保存的信息中找到。
在git中,分支是一种ref。 ref是指向提交的指针。
当你说'#34;分支没有提交"时,你的意思是"有人在分支a
上创建了一个新的分支b
;但是在分支b
"上没有人承诺。 git
并不知道发生的事情; git知道的是b
的分支引用指向可以从a
到达的提交。在许多情况下,这意味着b
和a
指向相同的提交。
您想要的图表类型的概念是每个提交都可以唯一地分配给分支。在git
中,提交可以从任何给定的ref到达,也可以从任何给定的ref无法访问。 (Reachable意味着您可以通过首先查看ref指向的提交,然后可能跟随提交的父指针来查找提交。)因此,可以同时从许多分支到达提交。通常" root"可以从所有分支到达提交。如果您在分支a
上并且创建了分支b
,那么从分支a
可以访问的所有提交也可以从分支b
到达。
当你想到一个分支b
作为一个"孩子"另一个分支a
,你的意思是有人在a
创建b
时。这不是git跟踪的东西。无法确定a
是从b
创建的,还是b
是从a
创建的,还是创建了a
和b
来自其他一些分支。
如果严格按照一组约定来分支和合并,那么你可以想象创建一个解释分支/提交拓扑的工具,假设这些约定产生你想要的东西。这有多大可能取决于认为你永远不会违反你的约定的现实程度。我不知道任何这样的工具,因为它们会对虚构的概念起作用,对于git并不重要,我不确定它在实践中是否有用。
您的示例图形成了一个描述特定分支实践的文档。这种做法强加了一些概念(如子分支),因此使用该类型的图表来描述该实践的理想是有意义的。但是在一个真正的回购中,事实并非如此。
此处更新
在评论中,您提到您无法告知给定提交的分支。一般来说这是正确的,因为这不是git中跟踪的东西。您可以从哪个分支可以判断提交是否可访问,因为所有git都知道 - 而有时允许您推断它在哪个分支上创建。
但你提到没有看到分支之间的分离,这让我思考。在您的gitk
图表中,只有并非分支之间的分离。并且可能是因为使用"快进"合并,无论好坏,都是git的默认行为,即使它可能非常混乱。
假设我开始使用只有一次提交的回购,以及master
和dev
分支。
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
中看到的图表可能会更适合您(尽管它仍然看起来与您在参考的图表中看到的非常相似)。