2017-10-13 222 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版本中更改的内容,然后手动解决冲突。那么这将是你需要的。

相关问题