2014-11-05 150 views
5

下面的截图取自SourceTree。我创建了一个简单的git仓库,其中包含一些提交。对于每一次提交,评论说明我进行提交时我在哪个分支上。为什么git分支图不能正确地跟踪分支?

An arguably suboptimal commit diagram

正如你所看到的,树图是(可以说)次优的,该提交掌握都不尽相同的颜色,也不是在一个单一的车道。为什么是这样?

(由GitHub上和到位桶得出的树形图看起来类似的问题受苦,所以它不只是SourceTree。)

显然它没有多大关系在这个简单的例子,但在我的一些项目,我们使用git-flow的变体,并且在查看树图时通常很难跟踪每个git-flow“泳道”。部分原因是因为树形图不会随着时间的推移保持每个泳道的颜色相同。

我怀疑是树图是(可以说)不理想的,因为git的回购实际上并不包含足够的信息来绘制树图我想要的方式。特别是,当两个提交是一个普通提交(例如,当你分支)的子代时,git不知道父提交是否与子1或子2“在同一分支上”。或者换句话说,它不会不知道哪个小孩是树枝,哪个小孩是树干的延续。我有这个权利吗?

+0

承诺掌握所有在单个通道中的通道:在提交94f458e处从蓝色变为紫色的通道。至于为什么它们是不同的颜色,那么对于源代码来说,这比堆栈溢出更重要。也许开发人员选择将按时间顺序排列的最新提交的路径视为不分支的路径?根据路径的名称提交功能请求以更改它。 – 2014-11-05 23:36:41

+0

当我说“车道”时,我的意思是“列”。而我所希望的是,如果所有提交给主人的提交都在一个列中,而要发布的提交到另一列中。我的意思是,如果你给了人类DAG,分支指针和提交列,他们可能不会像上面那样绘制树图。 – 2014-11-06 15:37:50

+0

尽管git并没有要求用户提供足够的信息来绘制正确的泳道,但在许多情况下,通过使用提交消息作为提示可以推断出更好的绘图。例如,合并消息通常开始“合并分支'B'到A”;在这种情况下,很明显两个源分支的名称应该用于泳道目的。用户可以轻松添加更多清晰度;例如,每当我创建一个分支时,我都会在其中创建一个空的提交“从'A'创建分支'B'”。图形绘制程序可以提供更多的提示。 – 2017-01-17 02:53:26

回答

2

至于其他的答案也提到,这简直混帐的性质:一个Git承诺不包含用户是在何时作出的承诺哪一个分支的任何信息。 (这些信息不能从git确实维护的信息中可靠地推断出来,这当然包括DAG。)这是git作者设计的选择。 Mercurial相比之下,确实存储每个提交的分支名称。 Git的倡导者认为这是一件坏事,因为它不鼓励创建可能临时的分支来尝试解决问题,而且分支名称之间的冲突很容易出现。例如,参见The Differences Between Mercurial and Git

Mercurial支持者认为,将分支名称与每次提交一起存储是一件好事,因为它可以更容易地维护可解释的历史记录。 Mercurial存储分支名称,每个提交似乎是Why I Like Mercurial More Than Git的作者更喜欢Mercurial而不是Git的主要原因。

+0

如果使用Mercurial的命名分支,Mercurial将在每次提交中存储分支名称。或者,如果想要类似git的行为,可以使用Mercurial的书签。 – 2015-06-19 19:25:07

3

在git中,“branches”实现为指向变更集的指针。

这意味着,一个特定的变更可以同时“属于”几个分支。

也就是说 - 它在运行时解决,你删除一个分支(或修改任何其他方式的图)之后 - 你不能告诉它所在的分支致力于最初。

在你的情况下,94f458e变更集属于masterrelease,所以图是完全正确的。

+1

这听起来像你基本上同意我在问题最后一段中写的内容。除此之外,你没有看到Git目前的行为是没有那么有用的,而不是假设性的。在这一点上,我会不同意:我可以想象一个假设的VCS能够保持git当前抛弃的信息,我可以想象这些信息在某些设置中是有用的。比如,这个。 – 2014-11-06 00:11:32

+0

对不起,如果我听起来不愉快。我真的很感激你花时间回答这个问题! – 2014-11-06 00:14:22

+0

@Adam L. Taylor:好吧,git不会跟踪变更集致力于哪个分支的信息。 Mercurial的确如此。 – zerkms 2014-11-06 03:03:03

0

提交不是“在”分支。分支只不过是您感兴趣的提交的本地方便名称。重要的是你的回购历史的结构。专注于此。提交94f18d都是这两个分支的历史记录的一部分,他们的提交releasemaster提交的祖先。

如果您的公用事业已在左侧绘制master,则其提交将以蓝色绘制,并且所有release的祖先独有的颜色都将为洋红色。

这是多了还是少了什么@zerkms说过(我upvoted他的),只是从不同的角度。

+0

“如果你的公用事业已经在左边画出了主人,那么它的提交就会以蓝色绘制,并且所有对于发布的祖先来说都是独特的。”是的,这正是我想如何绘制的。这似乎可以说是git中的一个设计缺陷,它没有保留足够的信息来按照我希望绘制的方式绘制树。 – 2014-11-06 15:38:59

+0

事实证明,通过丢失“分支”是某种重量级抽象的概念,您可以获得相当多的信息,而不是将分支名称视为存储库中提交图上的可移动标签。承诺自己只是承诺。 – jthill 2014-12-05 04:38:11