zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    如何理解和计算活跃度。做了张脑图。欢迎大家提意见
    在虚拟服务器调试castle项目
    生成缩略图
    自己写的分页函数
    asp.net2.0 自带的邮件发送
    在.NET下如何用WebService实现身份认证,及如何跟踪用户的访问,如类似Possport的功能,不会还是用Session吧?
    邮箱验证
    ASP.NET菜鸟之路之Request小例子
    ASP.NET菜鸟之路之Seesion小例子
    ASP.NET菜鸟之路之Response小例子
  • 原文地址:https://www.cnblogs.com/cathygx/p/14296298.html
Copyright © 2011-2022 走看看