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