簡體   English   中英

git如何通過完全覆蓋主分支將分支合並到主分支

[英]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 XB vs Y

讓我們說在“我們的”分支中, master ,我們有文件unchangedno-conflictsconflictremoved 這些名稱與其他兩個分支中發生的事情有關。

待合並分支中的文件未unchanged (即,從BY的差異對於文件未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 完全忽略了從BY的差異 ; 對於后者,git嘗試將差異B to- X (我們的)和B to- Y (他們的)組合在一起,但是在組合期間發生沖突的情況下,它會選擇BX變化。

使用-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM