2016-09-29 65 views
0

Git存儲庫只有主人,每個人都在使用(不要評價我,目前爲止是一件小事),默認情況下啓用了Rebase。 AFAIK git-rebase根據日期重寫應用提交的歷史,並在此過程中根據需要進入「併發」狀態。但有一兩件事很討厭我和球隊,有時歷史不是線性的,遵循一些例子:Git Rebase創建非線性歷史記錄

enter image description here enter image description here enter image description here

什麼會發生在這裏?或者我誤解了git-rebase是如何工作的?

回答

2

歷史不是基於日期,而是基於Git基礎的底層圖形。例如,你的歷史看起來是這樣的:

    branchA 
        ↓ 
* -- * -- * -- * -- * 
     \ 
     * -- * -- * 
       ↑ 
       branchB 

每個那些*的代表在歷史上犯下的,但實際的日期是完全不相干的在圖形中的位置。讓我們用數字來表明其創建相對時間更換星(創建更大的數字後):

    branchA 
        ↓ 
1 -- 2 -- 4 -- 5 -- 8 
     \ 
     3 -- 6 -- 7 
       ↑ 
       branchB 

這是在每個分支上完美的罰款和「線性」(在時間上)歷史。如果您記錄branchA的歷史記錄,則會得到8, 5, 4, 2, 1;對於branchB,您將獲得7, 6, 3, 2, 1

現在,如果你變基branchBbranchA,Git的將改寫上branchB這些提交,並將其應用到branchA。在重寫時,Git 默認爲保持創作時間不變(但將提交時間重置爲當前時間)。所以,你會得到以下結果:

    branchA 
        ↓ 
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7' 
            ↑ 
            branchB 

(這裏的'表示,他們實際上是從原來的那些不同的提交,但他們確實有相同的內容和作者的時間)。

如果您現在查看branchB的日誌,您將得到以下結果:7', 6', 3', 8, 5, 4, 2, 1。這就是「時間悖論」的來源:你確實有一個完美的線性歷史(圖中線性爲本節)。但提交不一定按照他們最初編寫的順序進行。

這非常好,完全按設計:重新編輯不應該完全重置提交,所以原始作者信息(誰做了,誰做了什麼)仍然存在。