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

时间:2012-12-24 16:25:17

标签: git git-pull

在圣诞节前不久我们在其中一个存储库中执行git log --decorate --oneline --graph时,我们发现以下结构已经出现(旋转以强调脆弱的节日主题):

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

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

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

1 个答案:

答案 0 :(得分:36)

在这种情况下,情况是在存储库的一个克隆中master分支的顶端有未刷新的提交。然后,在上游完成大量新工作的一段时间内,git pull在同一个存储库中运行了多次。 (在这种情况下,它发生的原因是一个自动脚本,但如果开发人员只是反复进入分支以使其保持最新状态,而不是比较,那么同样的事情就会发生。)

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

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

如果你有一些具有类似结构的历史记录,并且想要找出引起这个问题的提交/开发者,那么你可以向下看星号(基本上跟随每个合并的第一个父级),直到你进入第一次非合并提交。在图片的情况下,那是b275805 - 应该提前推送的提交。

这是人们经常喜欢使用git pull --rebase的原因之一 - 它可以简化您的未经删除的历史记录。

为了给予应有的信用,我的同事Matthew Somerville发现了这一点并弄清了发生了什么。