2017-10-13 59 views
1

以下M是主人,A1A2是在新分店A關閉M如何將未來版本的git補丁應用到過去的版本?

A2是我感興趣的申請B的變化,而不考慮在A1

那裏發生了什麼不是A2依賴於A1(語義上講任何改變,我不關心A1儘可能B關注。

A1 - A2 
/
M 
\ 
    B 

我可以做一個補丁,我的眼睛,期待權。看起來這僅持有的A2變化。

當我以3種方式應用它時,它會嘗試合併A1的東西。

如果我沒有3種方式申請,我不能讓它工作,甚至沒有一個正常的合併衝突來解決。

櫻桃採摘也沒有幫助。

# The Setup 
mkdir git-problem && cd git-problem 
git init 
echo Original > a.txt 
git add a.txt 
git commit -am "initial" 

# Branch A 
git checkout -b branch-A 
echo A1 >> a.txt 
git commit -am "A1 Changes" 

echo A2 >> a.txt 
git commit -am "A2 Changes, the one's I want in branch-B" 

git format-patch HEAD~ 

# Branch B 
git checkout master 
git checkout -b branch-B 

# Tries to bring in both commits 
# git cherry-pick d012465 # the latest commit on branch-A 
# git am --3way -- 0001-A2-Changes-the-one-s-I-want-in-branch-B.patch 
# git am -- 0001-A2-Changes-the-one-s-I-want-in-branch-B.patch 

Ma.txt

Original 

A2a.txt

Original 
A1 
A2 

B,我想使它:

Original 
A2 
+0

確實你的步驟,我在櫻桃挑選合併衝突。你有什麼不尋常的設置。在gitattributes,例如? 'git check-attr -a a.txt'說。櫻桃的輸出是什麼? – max630

回答

1

git抱怨應用更改集 - 無論是從您生成的文件中獲取的還是存儲庫本身使用的cherry-pick - 因爲更改的上下文不匹配。也就是說,爲了知道在文件中插入A2行的位置,合併算法需要能夠找到A1行,因爲它知道A2就在A1之後。但在branch-B版本的文件中,沒有A1行。所以算法會變得困惑,並將它踢回給您進行手動合併。

這是一個足夠正常的情況,並且是任何時候您嘗試應用一組更改的上下文不匹配的地方(在本例中爲修訂版A1 )以及您要放置的位置(在此情況下爲修訂B)。

我喜歡解決這個問題的方式是git mergetool。這將調用一個類似編輯器的程序,幫助您查看上下文不匹配的地方,並手動選擇如何處理它們。在這個例子中,您可能需要編輯該文件的一小段文件以自行添加A2行。

爲了完整起見,UNIX patch工具有一個--fuzz選項,它告訴它忽略部分上下文並搜索不完全匹配。如果您使用的是patch,則使用該選項可能會解決您的情況,但我不確定是否有辦法將它傳達給git。

1

您還可以使用互動變基僅從A2更改應用到手動跳轉B。如下具體步驟:

git checkout -B B <commit id for A2> 
git rebase -i HEAD~3 

在變基交互窗口,改變提交的A1drop

pick <commit id for M> 
drop <commit id for A1> 
pick <commit id for A2> 

在底墊中,a.txt將有類似的衝突:

<<<<<<< HEAD 
Original 
======= 
Original 
A1 
A2 
>>>>>>> ebd0940... A2 

你應手動檢查版本A1版本中更改的內容,然後手動解決衝突。那麼這將是你需要的。

相關問題