如何用Git将单个dev分支合并至存在差异的ServerA和ServerB分支
解决方案:单个Dev分支同步到ServerA/ServerB且隔离分支差异
核心思路
用单个dev分支维护公共变更,通过「挑选提交」或「指定合并策略」同步公共代码,同时保留两个Server分支的专属变更,完全避免分支间的差异互相污染,也不用重复操作公共变更。
具体操作步骤
1. 创建干净的公共dev分支
建议基于ServerA和ServerB的共同祖先提交创建dev分支,确保初始状态是两个分支都认可的基础版本,从根源减少差异冲突:
# 先找到ServerA和ServerB的共同祖先提交ID git merge-base ServerA ServerB # 基于该提交创建dev分支 git checkout -b dev <共同祖先提交ID>
如果找不到共同祖先或嫌麻烦,也可以基于ServerA创建dev,但后续合并时要注意过滤分支专属差异。
2. 在dev上维护公共变更
所有需要同步到两个Server分支的代码,统一提交到dev分支:
# 在dev分支开发完成后提交 git add . git commit -m "feat: 公共支付功能优化"
3. 将dev变更同步到ServerA/ServerB
提供两种可靠的同步方式:
方式一:cherry-pick(精准控制单条提交)
只把dev上的公共提交分别挑到两个Server分支,完全避免分支差异传递:
# 同步到ServerA git checkout ServerA # 挑选dev上的目标提交(替换为实际提交ID) git cherry-pick <dev提交ID> # 若遇冲突,仅保留ServerA的专属代码,合并dev的公共逻辑后继续 git add . git cherry-pick --continue # 同步到ServerB同理 git checkout ServerB git cherry-pick <dev提交ID> # 解决冲突时保留ServerB专属代码,合并公共逻辑 git add . git cherry-pick --continue
方式二:合并时使用ours策略(批量同步提交)
如果dev上的公共提交较多,cherry-pick太繁琐,可通过合并策略确保当前Server分支的专属代码优先级最高,仅引入dev的公共变更:
# 同步到ServerA git checkout ServerA # 合并dev,用ours策略保证ServerA专属代码不被覆盖 git merge -s ours dev # 同步到ServerB同理 git checkout ServerB git merge -s ours dev
注意:这种方式要求dev分支严格只维护公共代码,不能混入某一个Server分支的专属变更。
4. 维护Server分支的专属变更
直接在ServerA或ServerB上提交专属代码即可,这些变更不会被同步到另一个Server分支或dev分支:
# 在ServerA开发专属功能 git checkout ServerA git add . git commit -m "feat: ServerA专属用户权限模块"
避坑提醒
- 禁止直接合并ServerA和ServerB,否则会把双方的专属差异互相传递。
- dev分支仅用于公共变更,不要在dev中修改某一个Server分支的专属代码,否则同步时会引发不必要的冲突。
- 冲突处理原则:优先保留当前Server分支的专属逻辑,只合并dev中的公共代码部分。
内容的提问来源于stack exchange,提问作者Wisconsin Wes
相关产品推荐
相关产品推荐

