从主人到远程分支的git rebase。

时间:2013-05-06 09:06:36

标签: git

我已经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

3 个答案:

答案 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&提交并推送