我已经google了,并阅读了很多文档。 但不幸的是我无法理解他们所有
我的情况是。
git branch -r
origin/HEAD -> origin/master
origin/master
origin/team/myteam
git branch -a
master
team/myteam
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/team/myteam
现在我想将每个补丁从master合并到远程mybranch
。
我试过
git checkout team / myteam
git rebase master
git status
On branch team/myteam
Your branch and 'origin/team/myteam' have diverged,
and have 238 and 18 diffrent commits each, respectively.
nothing to commit, working directory clean
似乎有效......但push
会返回错误..
我用gerrit。
git push origin HEAD:refs/for/team/mybranch
...
..
remote: Resolving
deltas: 100% (14481/14481) remote: Processing changes: refs: 1, done
To ssh://156.xxx.xxx.xxx/xxx ! [remote rejected] HEAD -> refs/for/team/myteam (change 228 closed)
error: failed to push some refs to 'ssh://156.xxx.xxx.xxx/xxx
答案 0 :(得分:3)
您的问题是工作流程。
由于您在推送到遥控器之前没有历史上在团队/ myteam分支下重新设置master,因此如果没有force push
,这是不可能的。它之前没有被重新定位,这就是分支机构分歧的原因。在没有强制推动的情况下,当前的状态将重新定位的合并推向遥控器是不可能的。一般来说,除非没有其他人使用远程分支,否则force push
不是一个好的选择。
有很多方法可以解决本地和远程分支出现问题的问题。
git merge
,然后git push
以使您的远程分支更新。这可能是最简单的。force push
到远程myteam分支并与团队成员协调,将强制推送与其本地存储库合并。这可能很痛苦。要在myteam上进行git合并(即,branchname),您可能需要删除本地分支以执行干净合并。删除本地分支是git branch -D branchname
。然后...
git checkout branchname
git pull -r origin branchname
git merge master
git push origin branchname
将来,你应该在每次推送到遥控器之前用master重新定位你的本地分支。有更快的方法来实现rebase而不是下面写的命令,但是我已经做了这个冗长用于演示目的。
git checkout mybranch
git fetch
git rebase origin/master
git push origin HEAD:refs/for/team/mybranch
PS。对不起,我不知道格里特。
PPS。在git中,force push
是两个操作的组合,delete
远程分支和push
本地分支到远程。
答案 1 :(得分:0)
我认为您希望推送到origin/team/myteam
,并且您可以在team/myteam
更新。
如果您使用team/myteam
重新定位master
,则会重写分支team/myteam
的历史记录,因此Git不允许您推送它,因为它与其中的历史记录冲突origin/team/myteam
。
如果您确定要执行的操作(重写原始仓库的历史记录),则可以强制执行以下操作:
git push --force
请注意,当他们拉扯origin/team/myteam
时,您的队友可能会遇到麻烦:不建议重写共享历史记录。
你可能想要merge
代替rebase
:在这种情况下,你可以做一个简单的推动,你将跳过潜在的麻烦。
答案 2 :(得分:-1)
1)因为你使用了gerrit并且你关闭了更改,这意味着你无法推送相同的ChangeID
2)您的工作流程不正确 你应该做git fetch origin然后git rebase origin master&提交并推送