由於不同的原因,我需要維護線性的master
分支。也就是說,該分支中的提交不能有多個父代。如何在git中保持線性歷史記錄
我們團隊中有多人,我們想讓feature
分支機構一起工作。通常我們在這個feature
分支上重新分配我們自己的個人提交,然後在功能準備就緒時將其合併到我們的devel
分支中。我們還取決於foreign
項目(該項目使用不同的分支機構,但我們將假設它在全部單獨的foreign
分支機構中有其獨立的起源),我們定期合併到我們的devel
分支機構中。
但是,所有這些工作都必須以線性形式最終轉發到master
分支。我們可以將所有這些更改壓縮爲master
(使用git reset --soft devel
)的單個提交,然後將master
合併回devel
。然而,我們想盡可能多的保持我們提交儘可能:
- 每個提交的信息(包括合併消息)應該被保留
- 拓撲順序提交之間,必須保留
- 承諾從合併
foreign
分支已經被壓扁成一個單一的「合併」提交(不可惜父信息) - 分公司
master
,devel
,feature
,foreign
必須保持完美向前兼容(因爲這是一個共享的存儲庫)
我最初的想法是:
- 創建
devel
- 一個
staging
分支變基staging
ontop的的master
- 重新合併新
staging
到devel
。
但這並沒有工作,因爲:
- 的
foreign
分支,是重建基礎,從它的起源,而不是壓扁 - 我不得不再次處理來自
devel
每一個衝突,而他們在devel
在我們衆多的合併過程已經處理本身
所以我打算做到以下幾點:
我們打電話div
devel
的最新承諾不在master
(最新分歧點)。如果master
有新的未合併到devel
的提交,則中止。也就是說,如果div
之後的master
有新的提交,則必須在此之前手動合併爲devel
。
對於每個提交從div
到devel
(在拓撲次序),執行git reset --soft
並提交更改成master
(具有相同的提交消息)。這意味着:
- 提交不在
div
後,但devel
之前壓扁:那些是無論是從foreign
合併(在這種情況下,我們很高興)或master
合併(在這種情況下,實際的承諾已經在主) - 提交了在之間得到適當的推入
master
此起彼伏,除了爲devel
並行分支,它看起來像犯每次解開另一側(這是醜陋的,但可能是不可避免的)
最後,我將master
合併回devel
,並且此合併提交下次成爲div
。
因爲我想最大限度地減少'撤銷'/'重做'的數量,我會添加以下限制到所選的拓撲順序:devel
中的提交只有一個父代會在master
。
總而言之,這看起來過於複雜。是否有內置的方法讓線性分支遵循非線性分支?否則,我的策略會起作用還是缺少真正重要的細節?
考慮到squash-commits和rebasing的風險性質,這聽起來不像使用功能分支是您團隊的解決方案。您可能希望直接提交給master(不如理想的功能分支,當然,但實現了您期望的線性歷史記錄,並且丟失提交的風險較低)。 – Makoto
我不認爲你可以維護大師並開發分支並實現這個目標。您最好的選擇似乎是放棄開發,將分支功能關閉,然後在合併到主設備之前重新設置功能分支。如果你想在合併到master之前「組裝」功能分支,你可以使用一個不需要的集成分支,並且嘗試利用rerere來避免在合併到master時必須重新合併衝突。 –
「foreign」分支怎麼樣?我無法重新設定它(這不在我的控制之下)。 – Nonyme