3

I already googled, and read many document. but Unfortunately I cannot understand them all

My situation is.

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

and Now I like to merge every patches from master to remote mybranch.

I tried

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

it seems works.. but push returns error..

I use 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
4

3 回答 3

3

您的问题是工作流程问题。

由于在推送到远程之前,您历史上没有在 team/myteam 分支下重新设置 master 的基础,因此如果没有force push. 它以前没有被重新定位,这就是分支出现分歧的原因。在目前的状态下,如果没有强制推送,将 rebase 合并推送到远程是不可能的。一般来说force push,除非没有其他人使用远程分支,否则这不是一个好的选择。

有很多方法可以解决本地分支和远程分支出现分歧的问题。

  • 然后您可以在git merge本地执行git push以使您的远程分支保持最新。这可能是最简单的。
  • 您可以弃用现有的远程分支并为您的团队推送到新的远程分支,然后与团队成员协调以开始使用新的远程分支。
  • 您可以force push到远程 myteam 分支并与团队成员协调以将强制推送与他们的本地存储库合并。这可能很痛苦。

要在 myteam 上进行 git 合并(即,分支名称),您可能需要删除本地分支才能进行干净的合并。这是git branch -D branchname删除本地分支。然后...

git checkout branchname
git pull -r origin branchname
git merge master
git push origin branchname

将来,您应该在每次推送到远程之前使用 master 重新设置本地分支。有比下面写的命令更快的方法来实现变基,但我为了演示目的而把它写得很详细。

git checkout mybranch
git fetch
git rebase origin/master
git push origin HEAD:refs/for/team/mybranch

PS。抱歉,我不认识格瑞特。

聚苯乙烯。在 git 中,force push是两种操作的组合,delete远程分支和push本地分支到远程。

于 2013-05-06T20:58:07.460 回答
0

我假设你想要推送到origin/team/myteam并且你是最新的team/myteam

如果你使用 rebase team/myteammaster你正在重写你的分支的历史,team/myteam所以 Git 不允许你推送它,因为它与它在origin/team/myteam.

如果您确定要做什么(重写原始仓库的历史记录),您可以使用以下命令强制推送:

 git push --force

请注意,您的队友在拉取时可能会遇到麻烦origin/team/myteam:不建议重写共享历史记录。

你可能想做 amerge而不是 a rebase: 在这种情况下你可以做一个简单的推送,你会跳过潜在的麻烦。

于 2013-05-06T09:16:49.050 回答
-1

1)由于您使用gerrit并且您获得更改已关闭,这意味着您无法推送相同的ChangeID

2)你的工作流程不正确你应该做 git fetch origin 然后 git rebase origin master & Commit and push

于 2013-05-06T10:58:04.520 回答