2016-10-04 187 views
3

由於不同的原因,我需要維護線性的master分支。也就是說,該分支中的提交不能有多個父代。如何在git中保持線性歷史記錄

我們團隊中有多人,我們想讓feature分支機構一起工作。通常我們在這個feature分支上重新分配我們自己的個人提交,然後在功能準備就緒時將其合併到我們的devel分支中。我們還取決於foreign項目(該項目使用不同的分支機構,但我們將假設它在全部單獨的foreign分支機構中有其獨立的起源),我們定期合併到我們的devel分支機構中。

但是,所有這些工作都必須以線性形式最終轉發到master分支。我們可以將所有這些更改壓縮爲master(使用git reset --soft devel)的單個提交,然後將master合併回devel。然而,我們想盡可能多的保持我們提交儘可能:

  • 每個提交的信息(包括合併消息)應該被保留
  • 拓撲順序提交之間,必須保留
  • 承諾從合併foreign分支已經被壓扁成一個單一的「合併」提交(不可惜父信息)
  • 分公司masterdevelfeatureforeign必須保持完美向前兼容(因爲這是一個共享的存儲庫)

我最初的想法是:

  1. 創建devel
  2. 一個staging分支變基staging ontop的的master
  3. 重新合併新stagingdevel

但這並沒有工作,因爲:

  • foreign分支,是重建基礎,從它的起源,而不是壓扁
  • 我不得不再次處理來自devel每一個衝突,而他們在devel在我們衆多的合併過程已經處理本身

所以我打算做到以下幾點:

我們打電話divdevel的最新承諾不在master(最新分歧點)。如果master有新的未合併到devel的提交,則中止。也就是說,如果div之後的master有新的提交,則必須在此之前手動合併爲devel

對於每個提交從divdevel(在拓撲次序),執行git reset --soft並提交更改成master(具有相同的提交消息)。這意味着:

  • 提交不在div後,但devel之前壓扁:那些是無論是從foreign合併(在這種情況下,我們很高興)或master合併(在這種情況下,實際的承諾已經在主)
  • 提交了在之間得到適當的推入master此起彼伏,除了爲devel並行分支,它看起來像犯每次解開另一側(這是醜陋的,但可能是不可避免的)

最後,我將master合併回devel,並且此合併提交下次成爲div

因爲我想最大限度地減少'撤銷'/'重做'的數量,我會添加以下限制到所選的拓撲順序:devel中的提交只有一個父代會在master

總而言之,這看起來過於複雜。是否有內置的方法讓線性分支遵循非線性分支?否則,我的策略會起作用還是缺少真正重要的細節?

+2

考慮到squash-commits和rebasing的風險性質,這聽起來不像使用功能分支是您團隊的解決方案。您可能希望直接提交給master(不如理想的功能分支,當然,但實現了您期望的線性歷史記錄,並且丟失提交的風險較低)。 – Makoto

+1

我不認爲你可以維護大師並開發分支並實現這個目標。您最好的選擇似乎是放棄開發,將分支功能關閉,然後在合併到主設備之前重新設置功能分支。如果你想在合併到master之前「組裝」功能分支,你可以使用一個不需要的集成分支,並且嘗試利用rerere來避免在合併到master時必須重新合併衝突。 –

+0

「foreign」分支怎麼樣?我無法重新設定它(這不在我的控制之下)。 – Nonyme

回答

1

@jamey's comment提到的,它很可能是最好的脫落的masterdevelop分支,分割特徵分支,在此之前合併到master變基。當你與一個特性分支完成後,你可以這樣做:

git rebase master myfeature 
git checkout master 
git merge --ff-only myfeature 

當你需要從foreign分支的更改進行合併,這樣做:

git merge --squash foreign 
git commit 

從手冊頁git merge

--squash

生產工作樹和索引狀態,就像一個真正的濱海ge發生了(合併信息除外),但實際上並未提交,請移動HEAD或記錄$GIT_DIR/MERGE_HEAD(以使下一個git commit命令創建合併提交)。這允許您在當前分支上創建一個單獨的提交,其效果與合併另一個分支相同(或者在章魚的情況下更多)。

相關問題