2017-07-30 79 views
2

定義從git merge documentation拉。(GIT合併)當使用「我們的」戰略,「我們的」選項和「他們的」選項?的<strong>遞歸</strong>合併策略

這隻能使用3路合併算法解決兩個頭。當有可用於3路合併不止一個共同的祖先,它創建的共同祖先的合併樹,並將其用作對3路合併基準樹。據報道,這會導致更少的合併衝突,而不會因從Linux 2.6內核開發歷史記錄中進行的實際合併提交所做的測試而導致混淆。此外,這可以檢測並處理涉及重命名的合併。這是拉取或合併一個分支時的默認合併策略。

遞歸策略可以採取下列選項:

如前所述,遞歸策略,這是默認的策略,利用了3路遞歸合併算法的(解釋hereWikipedia)。

我的理解是,衝突的帥哥必須手動解決,它們通常這樣表示

<<<<<<<<<<< 
developer 1's code here 
============ 
developer 2's code here 
>>>>>>>>>>> 

我們遞歸合併策略的選擇進行了說明如下:

這選項強制衝突的帥哥是自動解決通過支持我們版本乾淨。來自另一棵與我們不衝突的樹的變化反映到合併結果。對於二進制文件,整個內容都是從我們這邊拿來的。

這不應該與我們的合併策略混淆,它甚至不會查看其他樹包含的東西。它摒棄一切其他的樹一樣,宣佈我們歷史包含了所有在它發生了。

現在假設我有兩個分支Y和M的頭部,具有一個共同的基祖先乙如下

enter image description here

當合並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它建議使用遞歸戰略他們選項。但隨着遞歸戰略我們選項顯然是不同的我們戰略,因此也將在遞歸戰略他們選項是從我談論的他們策略不同。

+0

這個問題重複了很多其他問題的很多部分。考慮我的答案https://stackoverflow.com/q/42099431/1256452 https://stackoverflow.com/q/44212642/1256452和https://stackoverflow.com/q/44858155/1256452(也許從最後開始第一?)。 – torek

回答

2

git merge -s recursive -X ours Y將行30變成Print("bye"); 合併輸出?

不,它也會輸出Print("hello");。這是因爲只有對方(Y分支)更改了這個文件,M分支上的文件版本與它們的祖先B相同,所以遞歸合併策略保持Y分支的更新版本。

而且你可以有嘗試:只有文件的版本從M分支不同於他們的祖先B(如提交變更30線Print(「bye1」);),那麼-X選項可以工作。現在,如果您使用git merge -s recursive -X ours Y,則輸出將爲Print(「bye1」);

而且你還可以找到圖4article you linked,如果該文件的一方是與它們的祖先(如線30和70),該文件將保留另一側(改變)版本作爲合併結果。

原因git merge -s ours Y輸出打印(「再見」);:

正如文件稱, 這解決任何數量的頭,但由此產生的合併的樹始終是的當前分支頭,實際上忽略來自所有其他分支的所有更改

這意味着它將從Y分支忽視的版本,僅保留版本,當前分支。所以你得到的輸出爲M分支Print("bye");的版本。

爲什麼沒有git merge -s theirs的-s選項:

的Git只octupus我們遞歸決心子樹,這樣定義的合併策略-s theirs無法識別,這是一個設計問題。詳細原因,只有git版本控制系統開發人員可能知道。


您的具體情況(請確保development分支覆蓋master分支),你可以cherry-pick最新從開發分支提交到主分支-X theirs選項:

# On master branch 
git cherry-pick development -X theirs 

這將充分覆蓋master分支。

注:developmentgit cherry-pick命令裝置在提交該分支development是指向(最新提交上development分支)。您也可以使用commit sha-1值。

+0

爲什麼沒有**他們**的策略,因爲有一個**我們的**策略? – UnchartedWaters

+0

Git只能用octupus,我們的,遞歸,解析和子樹合併策略來定義。這是一個設計問題,只有git版本控制系統開發人員可能知道詳細原因。 –

+0

你提出的櫻桃採摘策略似乎並沒有導致乾淨的合併。我仍然得到'開發'形式的消息是X提交,Y提交'master'後面。但是,無論如何感謝您的幫助。 – UnchartedWaters

相關問題