让我们想象一下,我们有一个master
分支。
然后我们创建一个newbranch
git checkout -b newbranch
和两个新提交到newbranch
:commit1和commit2
然后,我们切换到主并cherry-pick
git checkout master
git cherry-pick hash_of_commit1
展望gitk
我们看到commit1和樱桃采摘的版本有不同的哈希值,所以在技术上它们是两个不同的提交。
最后,我们合并newbranch
进入master
:
git merge newbranch
而看到这两个提交与不同的散列是没有问题,但他们暗示,同样的更改应该应用两次合并,因此他们中的一个出现故障。
混帐是否真的犯内容的智能分析,同时合并,并决定改变不应该被应用两次或这些提交内部被标记为联系在一起?
简答
别担心,Git会处理它。
长一点的回答
不像如SVN 1,Git不会店三角洲格式提交,但是是基于快照 2,3。 虽然SVN会天真地尝试应用每个合并的提交的补丁(和失败,对你所描述的确切原因),Git的一般是能够处理这种情况。
合并时,Git会尝试将快照结合起来,既HEAD提交到一个新的快照。 如果代码或文件的部分是在两个快照相同(即因为一个提交已经樱桃挑选的),GIT中不会触及它。
来源
1 跳过三角洲Subversion中
2个 Git的基础知识
3 的GIT中的对象模型
经过这样合并可能有历史的樱桃采摘提交的两倍。
解决方案以防止此我从引用的文章 ,其建议有重复分支(樱桃采摘的)承诺合并之前使用变基:
混帐混帐摘樱桃后合并:避免重复提交
试想一下,我们有主支和分支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
编辑更正大卫柠檬的评论应该