在不对功能分支进行任何更改的情况下重新设置远程功能分支
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。推送失败,因为A
、B
、C
和D
之前已经被推送到refs/for/master
。一个提交不能被审核并提交两次。
如果 releasevX.Y
还不存在于远程存储库中,您可以要求某人在网络 D
上创建引用 UI。此人应具有 refs/heads/*
的访问权限 Create Reference
。如果你有权利,你可以自己做。
如果存在,您可以要求某人使用 git push origin D:releasevX.Y
将 D
推送到 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
。该解决方案创建了一个合并提交,尽管它可能是一个快进合并。
因此,如果您希望历史记录整洁干净,要么获得更多访问权限,要么询问有权这样做的人。
我们在远程 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。推送失败,因为A
、B
、C
和D
之前已经被推送到refs/for/master
。一个提交不能被审核并提交两次。
如果 releasevX.Y
还不存在于远程存储库中,您可以要求某人在网络 D
上创建引用 UI。此人应具有 refs/heads/*
的访问权限 Create Reference
。如果你有权利,你可以自己做。
如果存在,您可以要求某人使用 git push origin D:releasevX.Y
将 D
推送到 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
。该解决方案创建了一个合并提交,尽管它可能是一个快进合并。
因此,如果您希望历史记录整洁干净,要么获得更多访问权限,要么询问有权这样做的人。