在不对功能分支进行任何更改的情况下重新设置远程功能分支

Rebase a remote feature branch without any changes in the feature branch

我们在远程 repo master 和 release 上有两个分支。在远程仓库中创建发布分支后,主分支中有一些与同一版本相关的更改,现在我需要将这些更改也获取到远程发布分支。让我们假设这是我创建发布分支时的样子

A-B (master) \ B (releasevX.Y)

现在 master 上的提交很少,如下所示

A-B-C-D-E-F-G (master) \ B (releasevX.Y)

现在提交 C 和 D 与发布 vX.Y 相关,我想将我的远程发布vX.Y 分支重新设置为提交 D,如下所示

A-B-C-D-E-F-G (master) \ D (releasevX.Y)

我知道最简单的方法是删除远程发布vX.Y 分支并创建一个新分支。但是我没有创建远程分支的权限。 我尝试使用 'git reset --hard''git rebase' 以及 'git push --force' 但我得到以下错误

! [remote rejected] HEAD -> refs/for/releasevX.Y (no new changes) error: failed to push some refs to

我知道它正在拒绝,因为分支上没有本地更改。但是如何在不重新创建分支的情况下将我的远程 releasevX.Y 分支与 master 分支的不同提交对齐?

所有更改都通过 gerrit 推送。

您可以使用以下命令在提交 D:

时变基 releasevX.Y 分支
git checkout master
git checkout -B releasevX.Y <commit id for D>
git cherry-pick <commit id for D>
git push -f 

那么提交历史将是:

A-B-C-D-E-F-G  master
       \
        D'    releasevX.Y

注:

  • -B git checkout 命令的选项将根据新指定的提交 D 重置 releasevX.Y,因为 releasevX.Y 分支名称已经存在。

看来您正在使用 Gerrit。推送失败,因为ABCD之前已经被推送到refs/for/master。一个提交不能被审核并提交两次。

如果 releasevX.Y 还不存在于远程存储库中,您可以要求某人在网络 D 上创建引用 UI。此人应具有 refs/heads/* 的访问权限 Create Reference。如果你有权利,你可以自己做。

如果存在,您可以要求某人使用 git push origin D:releasevX.YD 推送到 releasevX.Y,如果此人对 refs/heads/* 具有访问权限 Push ].

最后一个选项是你运行git checkout releasevX.Y;git merge D --no-ff;git push origin HEAD:refs/for/releasevX.Y。您已经拥有 refs/for/* 的访问权限 Push。该解决方案创建了一个合并提交,尽管它可能是一个快进合并。

因此,如果您希望历史记录整洁干净,要么获得更多访问权限,要么询问有权这样做的人。