问git cherr-pick的这个冲突是怎么产生的?

参考这篇文章https://zhuanlan.zhihu.com/p/58962086 学习了一下cherry-pick,
我这里有一个脚本,可以快速模拟情况

file=$readme.md
git init
touch $file

git add .
git commit -m 'init'

# 我切换到另一个分支dev,完成三个功能开发
git checkout -b dev
echo 'finish feature A' >> $file
git add .
git commit -m 'finish feature A'

echo 'finish feature B' >> $file
git add .
git commit -m 'finish feature B'

echo 'finish feature C' >> $file
git add .
git commit -m 'finish feature C'

# 再切换到master
git checkout master

上面那篇文章把featureA 和 featureB的节点一次cherry-pick到master上, git cherry-pick id可是当我尝试用featureC而不是featureB cherry-pick到master上时居然冲突了!! 不知道这是怎么回事

1 个赞

直观理解的话(因为我不会别的理解方法),因为C的那个commit是在B的状态上修改的。那么当你要在A上 c-p C的时候,由于修改的地方总体说来十分接近,git就会琢磨你到底想不想要保留B的修改:因为A中没有B,C又在B上添加了东西。它会想那你到底要不要保留B呢?这就触发了Conflict。


Edit:

说得稍微本质一点呢(假装我能),git的每次commit都是对当前完整repo的一个snapshot,而不是某次修改。你可以做这么一个实验瞅一下:

$ git push /path/to/any/other/repo/on/your/machine fa5ace9:a-weird-test
$ cd /path/to/any/other/repo/on/your/machine
$ git cherry-pick fa5ace9  # 或者 git cherry-pick a-weird-test

如果我没搞错,那边会出现完整的readme.md的信息,而不是C这一次修改