【Git】git cherry-pick 使用

背景:需要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

原文地址:https://www.cnblogs.com/cathygx/p/14296298.html