背景:需要cherry-pick几个commit到Integration branch
参考:
http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
https://blog.csdn.net/fightfightfight/article/details/81039050
Git Cherry-pick的简单应用场景:
初始
a - b - c - d Master
e - f - g Feature
结束
a - b - c - d – f’ Master
e - f - g Feature
master分支的末尾增加了一个提交f。
更精确地说是f',不是f。因为生成了一个新的commit(s),和f可能是不同的commit(s),仅仅是commit(s)最终的diff相同(在不冲突的前提下)。
Note:常见的两种冲突解决见Step2&3
Step1: 挑出需要pick的所有改动
$ git log --oneline
eee EEE
ddd DDD
ccc CCC
bbb BBB
aaa AAA
Step2: 从左到右按从先到后顺序pick进行
$ git cherry-pick aaa bbb ccc ddd eee
You are currently cherry-picking commit aaa.
…….
no changes added to commit
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:
git commit --allow-empty
If you wish to skip this commit, use:
git reset
Then "git cherry-pick --continue" will resume cherry-picking
the remaining commits.
Step3: 当按顺序到某一个pick时出现上述【后续改动覆盖当前改动的冲突自动解决】建议允许当前pick为空以保持commits数量匹配(也可以skip)
$ git commit --allow-empty
:q
Step4: 解决上述冲突后继续下一个pick,直至结束
$ git cherry-pick –continue
Step5: pick结束后确认当前栈顶包含所有picked commits(注意hash已更新)
$ git log --oneline -5
eee' EEE
ddd' DDD
ccc' CCC
bbb' BBB
aaa' AAA
Step1: 挑出需要pick的所有改动
$ git log --oneline
ww WW
rr RR
tt TT
ss SS
zz ZZ
yy YY
xx XX
Step2: 从左到右按从先到后顺序pick进行
$ git cherry-pick xx yy zz ss tt rr ww
…
error: could not apply ss...
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
Step3: 当按顺序到某一个pick时出现上述【无法自动解决的冲突】先查找冲突文件,通过IDE等方式手动解决冲突后通过git add加标记
$ git status
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: yyyyyy
both modified: xxxxxx
通过IDE等解决冲突后git add 所有冲突修改过的文件
$ git add xxxxxx
$ git add yyyyyy
Step4: 解决上述冲突后继续下一个pick,直至结束
$ git cherry-pick --continue
Step5: pick结束后确认当前栈顶包含所有picked commits(注意hash已更新)
$ git log --oneline -7
ww' WW
rr' RR
tt' TT
ss' SS
zz' ZZ
yy' YY
xx' XX
拓展:
自己实际操作下来,首先确实觉得git cherry-pick 要手动准备commitHash List并且注意保持原始提交顺序,容易引入错误。
也看到一些大牛针对cherry-pick在复杂冲突场景中应用的讨论。https://devblogs.microsoft.com/oldnewthing/20180312-00/?p=98215
当然目前遇到的应用场景过于简单,对于feature上少数commit需要被remove的。
Rebase,Cherry-Pick, Merge的区别
https://www.cnblogs.com/NaughtyCat/p/differ-with-rebase-merge-cherry-pick.html