2012-12-24 76 views
58

在圣诞节前夕在我们的资料库中的一个做git log --decorate --oneline --graph,我们发现下面的结构已经出现了(旋转强调脆弱的节日主题):为什么我的git历史看起来像圣诞树?

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

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

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

+6

*“来了下一个:为什么我的worktree看起来像一棵圣诞树?” * – Amber

+33

*“来了下一个:为什么我的圣诞树看起来像一个git的历史” * –

+0

圣诞树不会完成没有一些星星...... * *''*''*' – ADTC

回答

30

在这种情况下,情况是在存储库的一个克隆中的master分支的顶端存在未处理的提交。然后,git pull在同一个存储库中运行了很多次,这段时间在上游进行了大量新工作。 (在这种情况下,它是由于自动化脚本发生的,但如果开发人员只是为了保持最新状态而不是分批重复分支,则会发生同样的情况。)

当上游有新提交时每次拉取都会创建一个新的合并提交,因为在master中总是有一个提交,该提交并非位于master上游。

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

如果您有一些类似结构的历史记录,并且想要找出导致此问题的是哪个提交者/开发者,那么您可以在星线之下(基本上跟随每个合并的第一个父代)直到你到达第一个非合并提交。在图中的情况下,这是b275805 - 应该提前推送的提交。

这是人们经常更喜欢使用git pull --rebase的原因之一 - 它可以让您的过往历史保持简单。

要给出它应该到期的信用,我的同事Matthew Somerville发现了这一点,并计算了发生了什么。

+4

非常好。 +1。我只知道一个'pull --rebase'的潜在问题(http://stackoverflow.com/questions/2590260/when-will-git-pull-rebase-get-me-in-to-trouble/2590276 #2590276),但在这里,这真的有帮助。 – VonC