【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

posted @ 2021-01-19 09:28  CathyGao2018  阅读(1265)  评论(0)    收藏  举报