定義從git merge documentation拉。(GIT合併)當使用「我們的」戰略,「我們的」選項和「他們的」選項?的<strong>遞歸</strong>合併策略
這隻能使用3路合併算法解決兩個頭。當有可用於3路合併不止一個共同的祖先,它創建的共同祖先的合併樹,並將其用作對3路合併基準樹。據報道,這會導致更少的合併衝突,而不會因從Linux 2.6內核開發歷史記錄中進行的實際合併提交所做的測試而導致混淆。此外,這可以檢測並處理涉及重命名的合併。這是拉取或合併一個分支時的默認合併策略。
遞歸策略可以採取下列選項:
如前所述,遞歸策略,這是默認的策略,利用了3路遞歸合併算法的(解釋here和Wikipedia)。
我的理解是,衝突的帥哥必須手動解決,它們通常這樣表示
<<<<<<<<<<<
developer 1's code here
============
developer 2's code here
>>>>>>>>>>>
的我們遞歸合併策略的選擇進行了說明如下:
這選項強制衝突的帥哥是自動解決通過支持我們版本乾淨。來自另一棵與我們不衝突的樹的變化反映到合併結果。對於二進制文件,整個內容都是從我們這邊拿來的。
這不應該與我們的合併策略混淆,它甚至不會查看其他樹包含的東西。它摒棄一切其他的樹一樣,宣佈我們歷史包含了所有在它發生了。
現在假設我有兩個分支Y和M的頭部,具有一個共同的基祖先乙如下
當合並Y和使用M個默認的遞歸策略,線30將成爲Print("hello");
由於在第30行,Y表示從基部祖先的變化和M則沒有。但如果我對分支M和運行
git merge -s recursive -X ours Y
將30行成爲合併後的輸出Print("bye");
?
對於那些你們誰說,這是顯而易見的,注意我們選項狀態
此選項強制衝突的帥哥將自動解決通過支持我們版本乾淨。
但(據我所知)沒有衝突的猛男在管線30
爲了完整,我也會給他們選項的文檔:
這是的我們相反。
爲我們策略的文檔如下:
這解決任何數量的頭,但由此產生的合併的樹始終是當前分支頭,有效地忽略來自所有其他分支的所有更改。它是用來取代側枝的舊發展歷史。請注意,這是從-Xours選項將遞歸合併策略不同。
所以回到上面的例子,如果我的分支中號跑
git merge -s ours Y
,很顯然,線30將在合併後的輸出Print("bye");
。在這種情況下,爲什麼會出現也不是他們策略?如何能夠做到行爲相等,方向相反的我們策略?
我這麼問是因爲我工作的一個項目,我想經常和完全覆蓋主分支從另一個開發分支,每當在開發分支代碼成功生成變化。這樣我可以保證我的開發分支從來沒有漂移太遠了,從主分支,也是在主分支代碼將成功構建。
我見過this question其建議的解決方案
git checkout dev-branch
git merge -s ours master
但Git的只是輸出Already up-to-date
,儘管這兩個分支包含不同的代碼(dev-branch
實際上是一些犯的master
提前)。
我目前的解決辦法是做
git merge -s recursive -X theirs dev-branch
我也看到this question它建議使用遞歸戰略他們選項。但隨着遞歸戰略我們選項顯然是不同的我們戰略,因此也將在遞歸戰略他們選項是從我談論的他們策略不同。
這個問題重複了很多其他問題的很多部分。考慮我的答案https://stackoverflow.com/q/42099431/1256452 https://stackoverflow.com/q/44212642/1256452和https://stackoverflow.com/q/44858155/1256452(也許從最後開始第一?)。 – torek