Git:为什么我看到有效差异的合并冲突?

时间:2018-11-16 20:58:48

标签: git

给出两个分支“ 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会在乎?

1 个答案:

答案 0 :(得分:2)

您似乎误解了git mergegit 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与执行基准相同(但保留了源分支)