2014-07-23 146 views
6

我開始工作主分支分支。大約一年前,我創建了另一個分支dev,其中我做了一些修改。從那時起,我繼續在開發分支上工作。現在我想將開發合併到主導致很多衝突。我想通過覆蓋主分支的內容來將開發者合併到主控中,即對於出現的任何衝突,我想保留開發者分支的代碼版本。如何做呢 ?git如何通過完全覆蓋主分支將分支合併到主分支

回答

5

你要使用的策略,這是使用-X標誌

git checkout master 
git merge -X theirs dev 
5

樹立了「用他們的合併」你可以用-X開關指定the strategy option

git checkout master 
git merge -X theirs dev 

有點說明。 -X theirs的意思是:使用遞歸策略與合併但回退到更改如果策略不能解決衝突。

這是-s ours不同(因爲某些原因沒有-s theirs),這將是一個貪婪的拿我們總是解決衝突。

git-merge(1)合併策略部分對此提供了更深入的解釋。

+0

什麼是-X在這裏? –

+0

@hrehman策略選項。添加了一個鏈接供進一步參考。 –

+0

在這裏要小心,'-X我們'或'-X他們'與''我們''是完全不同的。沒有「他們」。這聽起來像'-X他們'是OP想要的,所以我相信這是正確的答案(並提高了它)。 – torek

2

可以強制推到主與所有你提交

git push -f origin master 
1

由於Paulo Bu noted,GIT中提供了這種不同的方法,當你想用「我們」的方式合併,但只有一個「出來的盒子「,當你想要一個」他們「的方法合併。值得說明兩個舉例:

$ git merge -s ours deadbranch # merge deadbranch and ignore all its code 

或:

$ git merge -X ours livebranch # merge livebranch but use ours when conflicting 

也讓我在這裏指出,當您使用git merge,Git會先找到「合併基地」,在該點兩個分支機構上次同步:

  o - X <-- master 
     /
o - o - B 
      \ 
      o - Y <-- otherbranch 

這裏B代表提交那就是合併基礎,X是你分支的末端(master)和Y是另一個分支的提示。 git會做的是diff B vs XB vs Y

比方說,在 「我們的」 分支,master,我們有文件unchangedno-conflicts,和removed。這些名字是關於其他兩個分支發生的事情。

文件unchanged是不變的待合併分支(即,DIFF從BY顯示什麼都沒有文件unchanged)。 git merge永遠不會觸及它,所以無論我們給git merge的參數如何,都不會改變。

其他文件在master和/或其他分支中有一些變化。

文件no-conflictsmaster的頂部有一處變化,在底部的另一處有一處變化。這兩個變化不衝突。 git merge -s recursive將結合更改,無論您是否使用-X ours選項。然而,git merge -s ours將放棄其更改,保留我們的文件版本no-conflicts。對於這個的情況,結果是不同的。

文件在主文件的頂部有一個變化,另一個分支的變化也在頂部。 (這些變化可能在任何地方,它們只是必須重疊。「在頂部」使它重疊。)這意味着這些變化是衝突的。使用git merge -s recursive,您會收到投訴並必須解決衝突。添加-X ours和git會採取你的改變,拋棄他們的改變。使用git merge -s ours,git會把你的改變拋諸腦後 - 因此對於這個的情況,結果是一樣的。

文件removedmaster中沒有變化,但在其他分支中被刪除。在這種情況下,git merge -s recursive將刪除該文件,無論您是否使用-X ours。但是,git merge -s ours將忽略刪除。

總之,-s ours-s recursive -X ours之間的區別是,同前,的git 完全忽略DIFF從BY;對於後者,git會嘗試組合差異B - 至 - X(我們)和B - 至 - Y(他們的),但是在組合期間發生衝突時,它會選擇BX更改。

隨着-X theirs(這是真的-s recursive -X theirs),混帳嘗試製作diff結合起來,並在發生衝突的情況下,選擇在B至 - X變化B至 - Y變化。


這是可能實現的-s theirs即使混帳沒有這個建在等價的。要做到這一點,使用git merge --no-commit otherbranch,然後git rm -rf .從頂層除去最後的合併結果(有或無衝突) ,然後從頂層git checkout otherbranch -- .根據otherbranch重新填充樹和索引。然後簡單地git commit的結果。然而,這是非常罕見的,這就是爲什麼git沒有將其作爲內置策略。

相關問題