多个开发者如何在Gerrit的同一feature分支上协同工作
Gerrit 协同场景配置操作指引
一、所有协作开发者通用基础配置
- 安装Gerrit commit-msg钩子,用于自动生成/保留Change-Id
执行命令:
该钩子会自动在提交信息末尾添加Change-Id行,只要提交时不修改这一行,后续的amend提交都会自动关联到同一个Gerrit变更# 替换尖括号内容为你的Gerrit实际信息 scp -p -P <Gerrit SSH端口> <你的Gerrit账号>@<Gerrit域名>:hooks/commit-msg .git/hooks/ chmod +x .git/hooks/commit-msg - 配置pull默认走变基逻辑,避免产生多余合并提交破坏Change-Id连续性
执行命令:# 仅当前仓库生效 git config pull.rebase true # 如需全局所有仓库生效,添加--global参数 # git config --global pull.rebase true
Gerrit的存储逻辑和GitHub/GitLab有本质区别:未完成评审合入的变更不会存放在普通分支的refs下,统一存储在独立的
refs/changes/命名空间,这也是直接拉取feature/test分支看不到待评审变更的核心原因。
二、多开发者基于同一Change ID协同配置
- 拉取指定Gerrit变更的最新内容
不要直接拉取远程feature/test分支,直接拉取对应Change的补丁集,命令格式如下,也可以直接复制Gerrit变更详情页提供的Checkout命令:git fetch <Gerrit项目地址> refs/changes/<Change-ID最后两位>/<Gerrit变更编号>/<补丁集版本> && git cherry-pick FETCH_HEAD - 提交修改到同一Change ID
改动代码后不要新建提交,使用amend参数修改原有提交,保证Change-Id不变:
推送后会自动在原有Gerrit变更下生成新的补丁集,所有协作者拉取最新补丁集即可拿到更新内容。git add <修改的文件> git commit --amend # 不要修改提交信息末尾的Change-Id行 git push origin HEAD:refs/for/feature/test - 冲突处理规则
拉取最新补丁集出现冲突时,解决冲突后执行git rebase --continue,再用git commit --amend提交,保持Change-Id不变即可。
三、其他设备看不到Gerrit变更的解决配置
- 先校验远程仓库地址配置正确:
执行git remote -v查看origin地址是否为Gerrit的项目地址,配置错误的话执行以下命令修改:git remote set-url origin <Gerrit项目地址> - 拉取指定变更内容:
不要使用git pull origin feature/test拉取,按照上文提到的拉取补丁集命令操作,即可拿到待评审的变更内容。 - 如需本地分支自动跟踪该变更的更新,执行关联配置:
后续直接执行git branch --set-upstream-to=refs/changes/<Change-ID最后两位>/<Gerrit变更编号>/<最新补丁集版本> feature/testgit pull --rebase即可拉取该变更的最新补丁内容。
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

