为什么我的 Git 历史看起来像棵圣诞树?

当在圣诞节前不久在我们的一个仓库中执行 git log --decorate --oneline --graph时,我们发现出现了以下结构(旋转以强调微妙的节日主题) :

redacted git log output, rotated to look like a Christmas tree

提交图中的这种模式是如何产生的?

当然,这样做有些愚蠢,但这里有一个有趣的观点ーー当你在 git 历史浏览器中看到提交图中的特定模式时,通常很难看出如何解释它们。

10542 次浏览

在这种情况下,在存储库的一个克隆中,在 master分支的顶端有一个未推送的提交。然后,在同一个存储库中多次运行 git pull,在此期间有许多新的工作在上游完成。(在这种情况下,发生这种情况是因为自动化脚本,但是如果开发人员只是为了保持分支的最新状态而不是重新基础化,那么同样的事情也会发生。)

当上游有新的提交时,每次提交都会创建一个新的合并提交,因为在 master中总有一个不在 master上游的提交。

最终,来自该存储库中主分支的历史记录被推送到上游,因此其他开发人员在下一次从上游存储库中提取时,会看到提交图中突然出现这个结构。

如果你有一些类似结构的历史,并且想找出是哪个提交/开发者导致了这个问题,你可以只看星星(基本上跟随每个合并的第一个父)直到你到达第一个非合并提交。在图中的例子中,那就是 b275805ーー本应更早推出的提交。

这就是人们经常喜欢使用 git pull --rebase的一个原因ーー它可以使您的未推送历史记录保持简单。

我的同事 马修 · 萨默维尔注意到了这一点,并弄清楚了发生了什么。