Gerrit如何将dev分支待审补丁集迁移到已合入的master分支
Gerrit dev分支废弃变更迁移到master分支解决方案
报错根因说明
- cherry-pick冲突:dev分支合入master时的合并逻辑与补丁基线存在差异,导致代码行冲突
- 无法为废弃变更新增补丁集:dev分支被标记为停用后,对应
refs/for/dev下的变更已被Gerrit自动标记为废弃状态,禁止修改 - 相同Change-Key冲突:Gerrit全局唯一的Change-Id已经绑定了原dev分支的废弃变更,无法重复绑定到master分支的新变更
- 直接push报错:通常是未解决冲突、未更新Change-Id导致的规则校验不通过
方案1:保留完整评审评论的迁移方案
此方案适用于拥有Gerrit变更移动权限的场景,可完整保留原变更的所有评审评论、历史补丁集记录:
- 打开原dev分支变更的Gerrit网页端页面,在右上角操作菜单找到Move选项
- 目标分支选择
master,勾选「必要时合并」选项后提交 - 若触发冲突提示,按以下步骤本地解决后推送:
# 拉取最新master代码 git fetch origin master && git checkout origin/master # 拉取对应变更的补丁集,将尖括号内容替换为实际值,示例:refs/changes/45/12345/3 git fetch origin refs/changes/<后两位变更号>/<变更号>/<补丁集号> && git cherry-pick FETCH_HEAD # 解决所有冲突后标记已解决 git add . # 保留原提交信息中的Change-Id,不要修改,完成拣选 git cherry-pick --continue # 推送到master的评审分支 git push origin HEAD:refs/for/master - 推送完成后,原变更的所有历史数据会自动关联到新的master分支变更条目下。
方案2:无法直接迁移时新建master分支变更方案
如果没有移动权限、原变更已被锁定,按以下步骤创建新的变更,可手动关联原评审记录:
- 基于最新master创建本地临时分支
git fetch origin master && git checkout -b migrate_temp origin/master - cherry-pick原dev分支的对应提交,替换为实际的提交哈希值
git cherry-pick <原提交哈希> - 解决冲突后,修改提交信息删除原有Change-Id:
git add . git commit --amend # 在弹出的提交信息编辑页,手动删除Change-Id: xxxx那一行后保存退出,Gerrit的commit-msg钩子会自动生成全新的Change-Id - 推送到master评审分支
git push origin HEAD:refs/for/master - 若需要关联原评审信息,可在新变更的描述区补充说明:
本变更迁移自原dev分支变更#<原变更号>,评审历史可参考原变更记录
内容的提问来源于stack exchange,提问作者sham1810
相关产品推荐
相关产品推荐

