在学习 Git 时,对我来说最大的惊喜之一是修订不会永久与特定分支相关联。相反,一个分支仅仅指向一个特定的版本。一旦我完全内化了这个概念,我意识到我不明白如何正确使用这个功能。
我读过一篇关于成功的 Git 分支模型的著名文章,其中将分支描述为行,而修订则明显与一行相关联。考虑以下摘录:
这显示了两个功能分支(称为featureA
和featureB
)和一个develop
分支。而且,featureB
被完全合并develop
,然后又短暂地分叉,只能重新合并。
这看起来不错,整洁且易于理解,并且恰好是在此过程结束时,回购在 Mercurial 之类的东西中的字面意思。我非常了解这一点,我喜欢它,并且我想像这样开发(在 Mercurial 中我做到了)。然而,在 Git 中,最终状态并非如此。它看起来像这样:
换句话说,我们掌握的关于这两个特性分支的唯一信息是它们现在与开发分支处于相同的修订版中。因此,我们可以推断出整棵树的最佳结果是:
换句话说,所有关于发展历史的好信息都丢失了;它一开始就没有被记录下来。观察第一张图中,三个修订在featureB
合并到 之前是如何清楚地打开的develop
,但我看不出我们如何知道这三个修订在featureB
合并之前是打开的。
这个对吗?以上是我在 Git 中事后可以恢复的最好方法吗?因此,这篇文章的截图是否具有误导性?还是有什么重要的我错过了?