[英]Git merge diff3 style need explanation
我已經合並了2個分支並且出現了沖突,我需要一些提示,它從它結束的地方開始,等等。我用一些偽造的數據替換了代碼,以便於閱讀和討論。
<<<<<<< HEAD
aaaaaa
||||||| merged common ancestors
<<<<<<< Temporary merge branch 1
bbbbbb
=======
cccccc
>>>>>>> mybranch
dddddd
<<<<<<< HEAD
eeeeee
||||||| merged common ancestors
ffffff
||||||| merged common ancestors
gggggg
=======
>>>>>>> Temporary merge branch 2
=======
hhhhhh
>>>>>>> mybranch
您在此示例中看到的內容(使用Temporary merge branch
標記)是diff3與縱橫交錯合並沖突的結果。 我將用一系列定義來解釋這一點。
只要兩個分支在不同的時間點彼此合並,就會發生縱橫交錯。
m3 *
|\
| \
| * B1
| |
m2 * * B0
|\/|
|/\|
m1 * * A
| /
|/
m0 *
考慮這一系列事件:
m0
作為origin / m aster存在 feature-A
,其中一個提交A
m1
由其他人承諾掌握 A
的新功能分支feature-B
origin/master
( m1
)合並到feature-B
。 它沖突,我解決它。 合並提交是B0
。 B1
。 feature-A
已准備好發貨,因此有人將其合並為master
。 它有沖突。 他們解決了它,但它們的分辨率與B0
的分辨率不同。 合並提交是m2
。 feature-B
已准備好發貨,因此有人將其合並為master
。 git嘗試確定合並基數 ,但m1
和A
都兼容合並基礎。 git在臨時合並分支中合並m1
和A
,這會導致沖突。 我們在合並的共同祖先部分看到diff3輸出,類似於OP的問題。 關閉diff3,這個合並沖突看起來就像這樣:
<<<<<<< HEAD
aaaaaa
=======
hhhhhh
>>>>>>> mybranch
首先,使用所有額外的標記,您將需要確定實際的沖突線是什么,因此您可以將它與diff3共同祖先輸出區分開來。
aaaaaahhhhhh,那好一點。 ;-)
在兩個沖突的決議是矛盾的情況下, aaaaaa
和hhhhhh
是兩項決議。
接下來,檢查合並的共同祖先的內容。
有了這個特定的合並歷史,有超過2個合並基礎,這需要多個臨時合並分支,然后合並在一起。 當存在許多合並基礎和沖突時,結果可能變得非常毛茸茸且難以閱讀。 有人說不要打擾,只是為這些情況關閉diff3。
還要注意git內部可能決定使用不同的合並策略來自動解決沖突,因此輸出很難理解。 如果可以,請理解它,但要知道它不是供人類消費的。 在這種情況下,將mybranch
合並到bbbbbb
和cccccc
之間的Temporary merge branch 1
時發生沖突。 行dddddd
在臨時合並分支之間沒有沖突。 然后在將Temporary merge branch 2
到具有多個共同祖先的HEAD
時發生單獨的沖突。 HEAD
通過將ffffff
和gggggg
合並為eeeeee
解決了沖突,但Temporary merge branch 2
通過刪除(或移動)線來解決相同的沖突(因此在======
和Temporary merge branch 2
之間沒有線。
你如何解決這樣的沖突? 雖然技術分析是可能的,但您最安全的選擇通常是回過頭來查看沖突周圍所有相關分支的歷史記錄,並根據您的理解手動制定分辨率。
這些沖突是最糟糕的,但有一些行為將有助於防止它們。
避免縱橫交錯合並 。 在上面的示例中, feature-B
將origin/master
合並為B0
。 這種合並可能與主人保持同步是不必要的(雖然有時候是這樣)。 如果origin/master
從未合並到feature-B
,那么就沒有合並縱橫交錯,並且m3
將與A
作為唯一的合並基礎發生正常沖突。
m3 * m3 * |\\ |\\ | \\ | \\ | * B1 | * B1 | | | | m2 * * B0 VS m2 * | |\\/| |\\ | |/\\| | \\| m1 * * A m1 * * A | / | / |/ |/ m0 * m0 *
m2
和B0
具有不同的沖突解決方案。 如果他們以相同的方式解決了沖突,那么m3
將是一個干凈的合並。 雖然這是一個簡單的縱橫交錯合並應該具有相同的分辨率。 其他情況可能正確地具有不同的分辨率。 當合並點之間有兩個以上的合並基礎和多次提交時,事情變得更加復雜。 也就是說,如果你故意在交叉情況下與沖突解決方案不一致,那么以后會出現令人頭疼的問題。 這是一篇關於git的diff3合並樣式的文章。 它指出很難判斷是否在這種風格中添加或刪除了行。
如果您正在尋找具體信息,我建議您優化您的問題。 很難說出你在問什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.