如何将Gerrit分支合并到另一个Gerrit分支中?

42
我正在使用 Gerrit 2.4.2 版本。我有一个名为 master 的分支,并创建了一个新的分支,名为 newbranch。然后我向远程 (Gerrit) 的 newbranch 推送了一些更改。在 Gerrit 中验证后,我将更改合并到了 newbranch
现在我想将 newbranch 合并到 master,更新 master(包含来自 newbranch 的更改),并删除 newbranch 分支。
我尝试过这样做:
git fetch
git checkout master
git merge newbranch
git push origin master:refs/for/master

但 Gerrit 返回以下消息:

 ! [remote rejected] master -> refs/for/master (no new changes)

我应该怎么做?

3个回答

37
这个情况已经被报告为Gerrit中的一个错误。这里有一个来自Gerrit问题跟踪器的解决方案/变通方法:
根据我所知,你目前有两个选择:
1. 强制推送到refs/heads。这只是一个快进操作,理论上所有的代码都已经被审查和验证过了。没有必要再次进行这个过程,所以跳过它,直接推送到refs/heads而不是refs/for。
2. 继续创建一个合并提交。使用'git merge --no-ff'命令,即使在你的快进情况下并不需要创建一个合并提交。然后,这个合并提交可以被上传、审查、验证和正常合并。
我的公司倾向于选择第二个选项。我将把这个问题标记为不修复,但如果你有任何关于如何更好地解决这个问题的建议,请告诉我们。

如果在合并提交正在审核的同时,有人向主分支提交了一个提交,会发生什么?那么我会遇到合并冲突,对吗?我该如何解决这种情况? - JohnyTex
@JohnyTex 在这种情况下,你需要将修改内容重新基于最近更新的主分支,并像处理其他情况一样修改合并提交。 - Mirrana
我已将问题的URL更新为新的URL,旧的URL将重定向至新的URL。 - undefined

13

如果合并是一个快速向前合并,那么就不存在要推送到 Gerrit 的对象,因为快进只是移动分支指针。

你需要强制执行合并以创建一个对象,避免快速向前合并:

git merge --no-ff

3
以下命令完美运行。
git checkout master
git merge --no-ff newbranch

您可以使用默认的提交信息进行保存。确保已生成更改ID。您可以使用以下命令来确认。

git commit --amend

然后使用以下命令推送。
git push origin HEAD:refs/for/refs/heads/master

您可能会遇到以下类似的错误提示信息。
! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

为解决此问题,gerrit项目管理员必须在gerrit中创建另一个引用,命名为'refs/for/refs/heads/master'或'refs/for/refs/heads/*'(将来将涵盖所有分支)。然后授予此引用的“Push Merge Commit”权限以及如果需要提交GCR则授予“Submit”权限。
现在,请再次尝试上述推送命令,应该可以正常工作。
致谢:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://dev59.com/eGEi5IYBdhLWcg3whckh#21199818


很奇怪,但在我的情况下 git merge --no-ff 不起作用,但是 git merge --no-ff branchName 很好用。 - HereAndBeyond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接