![](/img/trans.png)
[英]In GIT how to merge a development branch into master branch by completely overriding the master branch?
[英]git How to merge a branch into the master branch by completely overwriting master branch
我開始在master分支上工作。 差不多一年前,我創建了另一個分支開發 ,我做了一些更改。 從那時起,我繼續在dev分支上工作。 現在我想將dev合並到master中導致很多沖突。 我想通過覆蓋master分支的內容將dev合並到master中,即出現任何沖突,我想保留dev分支的代碼版本。 如何做呢 ?
您將要使用“使用他們的合並”策略,該策略使用-X標志設置
git checkout master
git merge -X theirs dev
您可以使用-X
開關指定策略選項 :
git checkout master
git merge -X theirs dev
有點解釋。 該-X theirs
意思是:使用與合並遞歸策略,但退回到他們的變化,如果該策略無法解決沖突。
這與-s ours
(由於某種原因,沒有 - -s theirs
)不同,這將是我們總是解決沖突的貪婪。
git-merge(1)
Merge Strategies部分對此進行了更深入的解釋。
您可以使用所有提交強制推送到master
git push -f origin master
正如Paulo Bu所說 ,當你想要一個“我們的”方法合並時,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首先找到“merge base”,即兩個分支最后同步的點:
o - X <-- master
/
o - o - B
\
o - Y <-- otherbranch
這里B
表示作為合並庫的提交, X
是分支( master
)的提示, Y
是另一個分支的提示。 git會做的是diff B
vs X
和B
vs Y
讓我們說在“我們的”分支中, master
,我們有文件unchanged
, no-conflicts
, conflict
和removed
。 這些名稱與其他兩個分支中發生的事情有關。
待合並分支中的文件未unchanged
(即,從B
到Y
的差異對於文件未unchanged
顯示什么都unchanged
)。 git merge
永遠不會觸及它,所以無論我們為git merge
提供什么參數,都沒有任何變化。
其他文件在master
和/或其他分支中有一些更改。
文件no-conflicts
在頂部的master
中有一個更改,在底部的另一個分支中有一個更改。 這兩個變化不沖突。 git merge -s recursive
將結合這些更改,無論你是否使用-X ours
選項。 但是, git merge -s ours
將放棄他們的更改,保持我們的文件版本no-conflicts
。 對於這種情況,結果是不同的。
文件conflict
在文件頂部的master中有一個更改,另一個分支在頂部也有不同的更改。 (變化可能在任何地方,它們只需要重疊。“在頂部”使它重疊。)這意味着這些變化發生沖突。 使用git merge -s recursive
,您將收到投訴並且必須解決沖突。 添加-X ours
和git將采取你的改變,扔掉他們的變化。 使用git merge -s ours
,git會接受你的更改並丟棄他們的更改 - 所以對於這種情況,結果是一樣的。
removed
文件在master
中沒有變化,但在另一個分支中被刪除。 在這種情況下, git merge -s recursive
將刪除文件,無論你是否使用-X ours
。 但是, git merge -s ours
將忽略刪除。
簡而言之, -s ours
和-s recursive -X ours
的區別在於前者,git 完全忽略了從B
到Y
的差異 ; 對於后者,git嘗試將差異B
to- X
(我們的)和B
to- Y
(他們的)組合在一起,但是在組合期間發生沖突的情況下,它會選擇B
到X
變化。
使用-X theirs
(這實際上是-s recursive -X theirs
),git嘗試組合差異,並且在沖突的情況下,選擇B
to- Y
更改B
to- X
更改。
即使git沒有內置它,也可以實現-s theirs
的等效。為此,請使用git merge --no-commit otherbranch
,然后使用git rm -rf .
從頂層刪除生成的合並(有或沒有沖突),然后git checkout otherbranch -- .
從頂層重新填充基於otherbranch
的樹和索引。 然后只需git commit
結果。 但是,很少有人想要這個,這就是為什么git沒有將它作為內置策略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.