如何混帐后摘樱桃的工作合并?(How does git merge after cherry-pic

2019-08-08 00:48发布

让我们想象一下,我们有一个master分支。

然后我们创建一个newbranch

git checkout -b newbranch

和两个新提交到newbranch :commit1commit2

然后,我们切换到主并cherry-pick

git checkout master
git cherry-pick hash_of_commit1

展望gitk我们看到commit1和樱桃采摘的版本有不同的哈希值,所以在技术上它们是两个不同的提交。

最后,我们合并newbranch进入master

git merge newbranch

而看到这两个提交与不同的散列是没有问题,但他们暗示,同样的更改应该应用两次合并,因此他们中的一个出现故障。

混帐是否真的犯内容的智能分析,同时合并,并决定改变不应该被应用两次或这些提交内部被标记为联系在一起?

Answer 1:

简答

别担心,Git会处理它。

长一点的回答

不像如SVN 1,Git不会店三角洲格式提交,但是是基于快照 2,3。 虽然SVN会天真地尝试应用每个合并的提交的补丁(和失败,对你所描述的确切原因),Git的一般是能够处理这种情况。

合并时,Git会尝试将快照结合起来,既HEAD提交到一个新的快照。 如果代码或文件的部分是在两个快照相同(即因为一个提交已经樱桃挑选的),GIT中不会触及它。

来源

1 跳过三角洲Subversion中
2个 Git的基础知识
3 的GIT中的对象模型



Answer 2:

经过这样合并可能有历史的樱桃采摘提交的两倍。

解决方案以防止此我从引用的文章 ,其建议有重复分支(樱桃采摘的)承诺合并之前使用变基:

混帐混帐摘樱桃后合并:避免重复提交

试想一下,我们有主支和分支B:

  o---X <-- master \ b1---b2---b3---b4 <-- b 

现在我们迫切需要在提交B1和B3的主人,而不是在b中的剩余的提交。 所以,我们做的是结账主分支和摘樱桃提交B1和B3:

 $ git checkout master $ git cherry-pick "b1's SHA" $ git cherry-pick "b3's SHA" 

其结果将是:

  o---X---b1'---b3' <-- master \ b1---b2---b3---b4 <-- b 

比方说,我们做的另一个承诺上主,我们得到:

  o---X---b1'---b3'---Y <-- master \ b1---b2---b3---b4 <-- b 

如果我们现在就合并分枝b进入主:

 $ git merge b 

我们会得到如下:

  o---X---b1'---b3'---Y--- M <-- master \ / b1----b2----b3----b4 <-- b 

这意味着由B1和B3引入的变化将在历史中出现两次。 为了避免这种情况,我们可以变基,而不是合并:

 $ git rebase master b 

这将产生:

  o---X---b1'---b3'---Y <-- master \ b2'---b4' <-- b 

最后:

 $ git checkout master $ git merge b 

给我们:

  o---X---b1'---b3'---Y---b2'---b4' <-- master, b 

编辑更正大卫柠檬的评论应该



文章来源: How does git merge after cherry-pick work?