给出两个分支“ target”和“ source”,它们指向同一提交。
git checkout target
git checkout -b source
并且鉴于“源”具有以下其他提交:
#source
a
b
当我挑选“ a”到“目标”时
#target
git cherry-pick a #sha a1
合并会导致冲突。
git checkout target
git merge source
# conflicts!
从差异的角度来看,Sha b仍然是适用于a的有效补丁。
git checkout target
git cherry-pick b #sha b1
# no conflicts
git日志图
$ git log --oneline --graph target source
* 8fb4695 (HEAD -> target) a
| * af785b5 (source) b
| * 7c102f6 a
|/
* ad8680a (master) initial commit
唯一的冲突必须是a1是较新的。这里发生了什么?为什么git会在乎?
答案 0 :(得分:2)
您似乎误解了git merge
和git cherry-pick
的作用。
您从以下历史记录开始:
Init --- A' : target
\
\-- A --- B : source
将source
合并到target
中时,发生的情况是git
将两个分支技巧进行比较。这里两个分支显然是不同的(并且A'不是源的祖先,因此没有快进合并),因此git合并了两个分支技巧并记录了新的合并提交。
Init --- A' ---------- C : target, source
\ /
\-- A --- B -- /
您可以考虑将两个分支合并为具有相同权限(as a side note you can merge more than two branches into one)的不同对等体。合并时,记录了一个具有两个祖先的提交(合并的两个分支的分支提示(此处的分支提示为A'和B)),该记录记录了两个分支中发生的更改。
如果要避免合并,则必须将源分支中的提交应用于目标分支。为此,通常将使用git rebase
而不是git merge
。当您同时执行两个cherry-pick
时没有冲突,这仅仅是因为在此运行两次cherry-pick
与执行基准相同(但保留了源分支)