git cherry-pick 将一个 commit 应用到多个分支

文章目录

    需求场景

    公司的一个控制设备运行的 android 平板蓝牙 app,针对每个客户都有一个独立的版本,
    功能和界面都有所不同。而有的客户又针对他们自己的客户,又做了功能和 UI 区分,但是差异很小。
    所以就放到了一个 git 代码仓库中进行管理,但是不同版本使用了不同的 branch 分支进行管理。

    在维护多个分支时,会遇到需要同时向多个分支添加同一个功能的需求。
    手动去每个分支修改一遍代码可太麻烦了,这时候,git cherry-pick 就排上了用场。
    可以将一个 commit 应用到多个不同分支上。

    操作流程

    先在某个分支 A 上,将功能开发好,提交一个 commit。

    然后,切换到另一个分支 B,通过 git log 查看之前提交的那个 commit 的 id。然后,执行

    git cherry-pick <commit-id>
    

    这样,分支 B 就获得了分支 A 的那个 commit 的改动。

    冲突

    毕竟两个分支的代码有一定的差异,所以遇到冲突很正常。例如:

    > git cherry-pick 42f37ae
    
    Auto-merging app/src/main/java/com/sunzhongwei/ble/Utils.kt
    CONFLICT (content): Merge conflict in app/src/main/java/com/sunzhongwei/ble/Utils.kt
    Auto-merging app/src/main/java/com/sunzhongwei/ble/MainViewModel.kt
    
    error: could not apply 42f37ae... some commit message
    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
    

    可以 3 个文件中,有一个自动 merge 失败,产生了冲突,需要手动解决。

    这时,shell 的提示符变成了

    (master|CHERRY-PICKING)
    

    可以使用 merge 工具来解决,或者 git diff 查看,并直接修改文件也可以。

    git mergetool
    

    查看修改

    注意,在 merge 过程中,使用 git diff 是看不到具体对比变化的。需要在 commit 之后,通过

    git show -p commit_hash

    来查看具体的代码变化。

    最后

    用了这么多年 git,我还是第一次用 cherry-pick,真是好用到流泪。。。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式