首先,一個忠告:如果你堅持這樣的工作流程,並解決當前的問題,你將面臨其他更微妙的問題。像這樣的工作流嘗試返回在開發生命週期的多個階段合併單個特性分支,這會遇到麻煩,因爲它們忽略了不同分支之間變化之間的可能交互。
就這麼說吧,讓我們專注於你的一些問題。您的場景(帶插圖)看起來像這樣:
首先,您有_dev
和_qa
分支。 (其他人,我們會撥出的時刻,爲簡單起見。)
A -- B -- C <--(_dev)(_qa)
我假設我們在在_dev
一切都已經過去了已經過去了_qa
_qa
(當然,一切的狀態開始應該在_dev
),所以它們指向相同的提交。這可能會排除一些會妨礙工作流程的複雜因素,但它仍然足以讓我們瞭解您目前面臨的問題。現在
DEV1創建特徵1
A -- B -- C <--(_dev)(_qa)
\
D -- E <--(feature1)
DEV1合併特徵1至_dev(假設它是在等待代碼審查在這一點上)
(_qa)
|
A -- B -- C ------ M1<--(_dev)
\ /
D -- E <--(feature1)
DEV1創建並開始使用feature2
(_qa) F -- G <--(feature2)
| /
A -- B -- C ------ M1<--(_dev)
\ /
D -- E <--(feature1)
DEV1合併到特徵2和_dev通過代碼評審。
(_qa) F -- G <--(feature2)
| / \
A -- B -- C ------ M1 ------ M2 <--(_dev)
\ /
D -- E <--(feature1)
DEV1嘗試合併特點2至_qa
好了,所以這裏是什麼情況?那麼,feature2
是_qa
的後裔(因爲我們在同一地點以_qa
和_dev
開始)。因此,您可以將_qa
快速轉發到feature2
(即使您不這樣做,生成的合併提交將具有與您的內容相同的內容)。但feature2
紮根於M1
;從feature1
的變化是feature2
可達,但無法從_qa
,所以合併將包括他們。
如果我們從_dev
(而不是兩個指向相同的提交)到達_qa
開始,則完全相同的分析將成立。如果由於某種原因,_qa
包含變化不可達形式_dev
,我們可以有一些像
Q <--(_qa) F -- G <--(feature2)
/ / \
A -- B -- C ------ M1 ------ M2 <--(_dev)
\ /
D -- E <--(feature1)
在這種情況下,GIT中會發現_qa
和feature2
之間的合併基礎 - 即一個共同的祖先。那將是B
。然後,將結合「的變化之間B
_qa
」與「B
和feature2
之間變化。同樣,B
和feature2
之間的變化包括由feature1
所做因爲feature2
在M1
(植根即點feature1
是後的變化。合併的)
在所有情況下,該點是相同的:在大多數情況下(包括在合併過程中),Git並不查看提交(或它們之間的增量)爲「屬於」這個分支或分支而是關心是否在合併基地的路徑上發生變化。
其中git 可以通過來查看「獨立分支」的變化的一種情況將是rebase
。但是,您的工作流程需要進行重大改革才能充分利用此優勢,並且會導致其他問題。這不是我在這裏推薦的路線。
另一種看起來可以修補工作流程的方法是要求開發人員在_dev
和_qa
之間的合併基礎上啓動新的功能分支。 但是這可能只會在路上起作用(除非改變總是「保持秩序」,一旦達到_qa
,這不是一個合理的假設 - 尤其是如果QA發現缺陷)。此外,這增加了一個功能與下一個功能之間的隔離,最終意味着您可能會遇到更多的合併衝突。
無論如何,我認爲你的爲什麼問題。至於什麼:
好,而你已經使用「混帳流」作爲通用術語「分支和合並戰略」,實際上混帳流是特定的分支與合併策略名稱。我建議閱讀它。您所描述的需求並不是獨一無二的,甚至是不常見的,因此您不必爲了滿足這些需求而自定義此流程,而是考慮人們如何使用此流程滿足這些需求。
嘿馬克,感謝您的詳細的答案:) 我已經看着GitFlow和問題依然存在 - 我們如何合併「轉發」只批准的功能? 就我所見 - 在GitFlow中,您穩定了開發分支,然後分離出一個版本,如果它是衝刺的結束並且1個功能尚未經過測試,該怎麼辦? 謝謝! :) –
@EdoMagen然後未經測試的功能不屬於'dev'分支。 –
然後QA在哪裏發生? 我們爲_dev和_qa的每個合併自動部署。 _dev是我們的集成環境,_qa是什麼測試,每個分支都反映在我們公司的一個子域中(dev.xxx.xxx和qa.xxx.xxx) 在合併之前是否有其他選項可用於QA並批准每個功能? –