2015-04-02 61 views
0

我已經簽出了一個分支,我想合併在主。分支背後的主人,因爲主人還沒有被合併到這個分支在兩週內,所以我想用從主所有更改。Git合併-X他們沒有合併所有的變化

我做到以下幾點:

git merge -s recursive -X theirs master 

對於它融合了大部分,但至少有衝突的地方,從他們沒幾個點。

舉例來說,有一行:

#import "VMVideo_Private.h" 

這是從主在某一點在過去的兩個星期中取出,但由於這一分支尚未在過去兩週合併它仍然存在在分支。

使用theirs合併後,它仍然存在。

而且,如果我嘗試只用手工合併:

git merge master 

這種特殊的衝突不上來的。

回答

3

在遞歸合併策略,-X theirs(或爲此事-X ours)簡單的說就是在發生衝突的情況下它會自動通過選擇「自己的版本」解決衝突(或「我們的版本」,以-X ours) 。

如果有沒有衝突,您的-X選擇根本不起作用。

例如,假設在原始(普通合併基礎)版本中,文件foo.txt,第34行,表示Rumplestiltskin。進一步假設您將其更改爲George Clooney。最後,假設文件foo.txt實際上在master改變,但遠不及線路34現在你問git的合併他們的(碩士)與你的變化:它讓你的變化,其中Rumplestiltskin變得克魯尼,因爲沒有衝突且其變動,其中foo.txt現在聲稱是真實的,而不是假的。由此產生的合併現在使關於克魯尼先生的主張(它聲稱是真實的),而不是關於童話人物。 (在某些情況下,git只是在執行各種版本的diff)將決定你和他們對某些代碼(或文本)所做的更改最好用某種在語義上無意義的東西來表示例如,對於C代碼和Java代碼,它可能會錯誤地在線上進行同步,除了緊湊大括號外,最終的合併可能會很快或很悲慘,有時候會選擇修改後的比較算法,例如「耐心差異」 )

1

大部分時間它是你的分支被合併回來並且強制和每個分叉點的根部隱藏了差異。有一個技巧來解決它。

假設你想從合併到當前的分支CUR,做

git merge -s recursive -X theirs master 
git commit 

然後執行後(你必須承諾在前):

git diff --ignore-space-at-eol cur..master | git apply 

這只是比較合併後的現在爲爲主分支,差異將被提取並應用編輯爲補丁。

+0

這似乎被設計成重新調整'cur'以完全匹配'master'。這不是一個合併,那是一個破壞者(一個合法的合併 - 我們的合併,這也是一個破壞者,但在另一個方向)。如果你想在「他們的」方向進行clobber合併,那麼在一次提交中很容易,儘管它需要多個git命令。 – torek 2015-04-02 20:00:25

+0

不。這是爲了重新調整* cur *以包含** master *中的所有內容。 – zsong 2015-04-02 20:04:51

+0

您如何將「包含所有內容」與「完全匹配」區別開來(除了行結尾的空格)?例如,假設'cur'具有'master'中不存在的'new.txt'文件。 'git diff ... | git apply'會*刪除* new.txt。很顯然,我必須接受並申請結果,但是一旦我做了,'cur'現在就匹配'master'。 – torek 2015-04-02 20:15:25

相關問題