2012-12-24 74 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