2017-08-16 72 views
1

我們計劃了一個我們認爲可以正常工作但存在問題的git工作流程。考慮到測試的團隊git流程

在SourceTree 我們有4個主要分支

  1. _dev(從中創建功能分支,每個特徵分支對應一個JIRA任務)
  2. _qa(到我們合併功能分支,一旦功能準備就緒,代碼在_dev上查看)
  3. _next-release(我們merg Ë當功能由QA批准的功能分支)
  4. (這是我們合併整個_next釋放分支時衝刺結束,從而合併只有經批准的功能)

我們也有版本分支這是我們合併在一個版本發佈主分支(這樣做是爲了確保我們能回到那個分支並進行調整,如果必要的,因爲我們的產品是一個可安裝一個)

我們有問題的情況是:

  1. DEV1創建特徵1(從_dev分支)
  2. DEV1合併特徵1至_dev(假設它是在這一點上等待代碼審查)
  3. DEV1創建並啓動對特徵2工作(從_dev分支再次)
  4. Dev1將feature2合併到_dev並傳遞代碼審查。
  5. DEV1嘗試合併特點2至_qa

結果:兩個特徵1和特徵似乎合併到QA,儘管特徵1還沒有準備好。

我們合併通過右鍵單擊分支選擇「合併featureX到當前分支」

請注意,我們有4個環境,使QA有一個地方,檢查的功能,(應)反映每個分支。

爲什麼功能與我們不想合併的功能合併在一起?

什麼是常見的工作流程,使合併只是驗證功能集成到一個版本,同時允許QA環境檢查功能,並允許乾淨的歷史,將反映各要素的生命週期 - 開發 - > QA - >發佈 - >版本

感謝

回答

0

首先,一個忠告:如果你堅持這樣的工作流程,並解決當前的問題,你將面臨其他更微妙的問題。像這樣的工作流嘗試返回在開發生命週期的多個階段合併單個特性分支,這會遇到麻煩,因爲它們忽略了不同分支之間變化之間的可能交互。

就這麼說吧,讓我們專注於你的一些問題。您的場景(帶插圖)看起來像這樣:

首先,您有_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中會發現_qafeature2之間的合併基礎 - 即一個共同的祖先。那將是B。然後,將結合「的變化之間B_qa」與「Bfeature2之間變化。同樣,Bfeature2之間的變化包括由feature1所做因爲feature2M1(植根即點feature1是後的變化。合併的)

在所有情況下,該點是相同的:在大多數情況下(包括在合併過程中),Git並不查看提交(或它們之間的增量)爲「屬於」這個分支或分支而是關心是否在合併基地的路徑上發生變化。

其中git 可以通過來查看「獨立分支」的變化的一種情況將是rebase。但是,您的工作流程需要進行重大改革才能充分利用此優勢,並且會導致其他問題。這不是我在這裏推薦的路線。

另一種看起來可以修補工作流程的方法是要求開發人員在_dev_qa之間的合併基礎上啓動新的功能分支。 但是這可能只會在路上起作用(除非改變總是「保持秩序」,一旦達到_qa,這不是一個合理的假設 - 尤其是如果QA發現缺陷)。此外,這增加了一個功能與下一個功能之間的隔離,最終意味着您可能會遇到更多的合併衝突。

無論如何,我認爲你的爲什麼問題。至於什麼

好,而你已經使用「混帳流」作爲通用術語「分支和合並戰略」,實際上混帳流是特定的分支與合併策略名稱。我建議閱讀它。您所描述的需求並不是獨一無二的,甚至是不常見的,因此您不必爲了滿足這些需求而自定義此流程,而是考慮人們如何使用此流程滿足這些需求。

+0

嘿馬克,感謝您的詳細的答案:) 我已經看着GitFlow和問題依然存在 - 我們如何合併「轉發」只批准的功能? 就我所見 - 在GitFlow中,您穩定了開發分支,然後分離出一個版本,如果它是衝刺的結束並且1個功能尚未經過測試,該怎麼辦? 謝謝! :) –

+0

@EdoMagen然後未經測試的功能不屬於'dev'分支。 –

+0

然後QA在哪裏發生? 我們爲_dev和_qa的每個合併自動部署。 _dev是我們的集成環境,_qa是什麼測試,每個分支都反映在我們公司的一個子域中(dev.xxx.xxx和qa.xxx.xxx) 在合併之前是否有其他選項可用於QA並批准每個功能? –