Git存儲庫只有主人,每個人都在使用(不要評價我,目前爲止是一件小事),默認情況下啓用了Rebase。 AFAIK git-rebase根據日期重寫應用提交的歷史,並在此過程中根據需要進入「併發」狀態。但有一兩件事很討厭我和球隊,有時歷史不是線性的,遵循一些例子:Git Rebase創建非線性歷史記錄
什麼會發生在這裏?或者我誤解了git-rebase是如何工作的?
Git存儲庫只有主人,每個人都在使用(不要評價我,目前爲止是一件小事),默認情況下啓用了Rebase。 AFAIK git-rebase根據日期重寫應用提交的歷史,並在此過程中根據需要進入「併發」狀態。但有一兩件事很討厭我和球隊,有時歷史不是線性的,遵循一些例子:Git Rebase創建非線性歷史記錄
什麼會發生在這裏?或者我誤解了git-rebase是如何工作的?
歷史不是基於日期,而是基於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
。
現在,如果你變基branchB
到branchA
,Git的將改寫上branchB
這些提交,並將其應用到branchA
。在重寫時,Git 默認爲保持創作時間不變(但將提交時間重置爲當前時間)。所以,你會得到以下結果:
branchA
↓
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7'
↑
branchB
(這裏的'
表示,他們實際上是從原來的那些不同的提交,但他們確實有相同的內容和作者的時間)。
如果您現在查看branchB
的日誌,您將得到以下結果:7', 6', 3', 8, 5, 4, 2, 1
。這就是「時間悖論」的來源:你確實有一個完美的線性歷史(圖中線性爲本節)。但提交不一定按照他們最初編寫的順序進行。
這非常好,完全按設計:重新編輯不應該完全重置提交,所以原始作者信息(誰做了,誰做了什麼)仍然存在。