事情澄清,我認爲:衝突與融合策略git本身的概念。 「合併請求」,OTOH,是gitlab的概念(和其他回購主機有類似的概念),但根本沒有任何合適的地方。你的問題最好通過談論git來回答;所以我們只需要知道合併請求是合併操作可能在git中開始的一個工作流程。因此,讓我們把你的問題分爲兩個部分:
順序梅傑斯
簡短的回答:有可能會發生衝突。
是否會有衝突取決於合併策略。我的測試表明,通常會有衝突,因爲git會看到第101-150行中的替代變化。由於這兩組變更都是增加的,所以我猜想你可以想象這兩行代碼沒有衝突 - 儘管目前還不清楚它們的順序會進去。您可以使用union
合併驅動程序讓git嘗試執行此操作;請參閱http://kernel.org/pub/software/scm/git/docs/gitattributes.html
您可以通過命令行參數告訴git以不同的方式解析合併,但由於這些方向將應用於整個提交 - 不僅僅是一個文件設置此條件 - 您通常不會想要至。你可以使用.gitattributes
來影響git如何合併一個文件,如果事先知道這種方法適合(整個)文件的話。
因此,如何更改merge
的行爲有很多選項 - 太多而不知道具體的預期結果。但通常情況下,使用默認的合併設置並在發生衝突時解決衝突效果很好,無論如何,以我的經驗。
併發梅傑斯
爲發生「在同一時間」一單式回購中的兩個合併這是不是真的有可能。如果主機提供某種方式直接在託管(origin
)倉庫中啓動合併 - 我實際上並不知道任何人都這樣做,但爲了爭辯 - 然後一個合併必須先完成,另一個合併以合併的結果爲起點;所以請參閱上一部分答案。
會發生什麼,一個人可以在一個回購進行一個合併,另一個人可以執行其他合併在第二回購,然後可以有衝突時,他們都嘗試與遠程同步起來。這裏是如何可能看:
(請注意,在本例子中,我假設真正合並 - 也就是說,如果你使用no-ff
選項會發生什麼,合併圖表可能比較簡單,但結果會。同樣儘可能衝突走,如果快進合併被允許。)
所以回購開始了與
B <--(branch_B)
/
x -- x -- O <--(master)
\
A <--(branch_A)
所有的提交包含一個文件。在O
該文件有100行。 A
和B
每個添加50個新行到文件的末尾。
現在愛麗絲合併branch_A
,鮑勃合併branch_B
,每個在他們的本地回購。所以,Alice有
B <--(branch_B)
/
x -- x -- O -- MA <--(master)
\/
A
^-(branch_A)
,Bob的
v-(branch_B)
B
/\
x -- x -- O -- MB <--(master)
\
A <--(branch_A)
分享他們的工作,他們將分別嘗試push
到origin
;和merge
一樣,即使他們試圖在同一時刻開始推送,也會在另一個開始之前完成。
所以愛麗絲得到她的推動,origin
被更新爲看起來就像她的本地。當Bob嘗試推送時,他得到一個錯誤,因爲他的master
位於origin
的master
後面(或者,我們可以說,一旦更新了origin/master
後,假設有典型的映射)。
因此Bob必須pull
(或fetch
和merge
)才能push
。爲了更清楚地說明,我們假設他是fetch
es。現在他有
v-(branch_B)
B
/\
x -- x -- O -- MB <--(master)
|\
| MA <--(origin/master)
|/
A <--(branch_A)
,並完成pull
的作用,他需要合併origin/master
爲master
- 所以即使這個情況歸結爲先覆蓋的「順序合併」的設想。事實上,如果使用快進合併跟蹤相同的場景,那麼顯然這裏需要的「第二次合併」與「第二次合併」完全相同,如果一切都是由一個用戶在一個回購中完成的話。
感謝您的詳細解答:) – Ragnarsson