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

更新日期: 2024-09-04 阅读次数: 1333 字数: 487 分类: Git

需求场景

公司的一个控制设备运行的 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 聊聊, 查看更多联系方式