从主分支到远程分支的Git变基。

3

我已经谷歌过并阅读了很多文件,但遗憾的是我不能完全理解它们。

我的情况是:

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

现在我想将主分支上的所有补丁合并到远程分支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

但是 push 返回错误.. 是什么错误? - 1615903
返回什么错误? - Th 00 mÄ s
谢谢大家,我编辑并留下了我的错误信息。 - Sungguk Lim
Rebase 会重写历史记录,在这种情况下,由于此原因,远程服务器拒绝接受它。通常在其他人可以访问的分支上使用 rebase 是一个坏主意 - 你为什么不使用 git merge 呢? - 1615903
1
请使用merge代替rebase,尤其是对于新手来说,我建议使用合并。 - Sébastien Dawans
3个回答

3

你遇到的问题是一个工作流问题。

由于在推送到远程仓库之前,你以往没有将主分支(master)在团队/我的团队(team/myteam)分支下进行过历史上的变基操作,所以现在想要推送变基后的合并(commit)到远程是不可能的,除非使用 强制推送(force push)。这也是为什么这两个分支出现了分歧的原因。通常情况下,强制推送 并不是一个好的选择,除非没有其他人正在使用远程分支。

有很多方法可以解决本地和远程分支发生分歧的问题:

  • 你可以在本地执行 git merge 然后执行 git push 以使远程分支保持最新。这可能是最简单的方法。
  • 你可以废弃(删除)旧的远程分支,然后将新的推送到你的团队的新远程分支上,并与团队成员协调开始使用新的远程分支。
  • 你可以 强制推送 到远程 myteam 分支,然后与团队成员协调合并他们本地存储库中的强制推送。这可能会很痛苦。

要在myteam分支上执行git merge (即分支名为branchname),你可能需要删除本地分支以执行干净的合并。使用 git branch -D branchname 命令可以删除本地分支,然后再执行以下操作:...

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

在将代码推送到远程仓库之前,您应该在每次推送之前将本地分支与主分支进行 rebase。有比下面的命令更快的方法来实现 rebase,但是为了示范目的,我已经写得很详细了。
git checkout mybranch
git fetch
git rebase origin/master
git push origin HEAD:refs/for/team/mybranch

PS. 抱歉,我不了解Gerrit。

PPS. 在git中,“force push”是两个操作的组合,即“删除”远程分支和将本地分支“推送”到远程分支。


0

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

如果你使用master来变基team/myteam,那么你会重写你的分支team/myteam的历史记录,因此Git不允许你将其推送,因为它与origin/team/myteam中的历史记录冲突。

如果你确定自己想要做什么(重写源代码库上的历史记录),你可以使用以下命令强制推送:

 git push --force

请注意,当您的团队成员拉取 origin/team/myteam 时可能会遇到问题:重写共享历史记录并不是推荐的做法。

您可能希望执行 merge 而不是 rebase:在这种情况下,您可以进行简单的推送,以避免潜在的麻烦。


正确的做法是什么,如果然后将主分支的提交推送到远程/团队/我的团队? - Sungguk Lim
你永远不应该进行Push操作,而且gerrit默认情况下也不允许这样做。 - forvaidya

-1

1) 由于您使用了Gerrit并且收到了变更关闭的通知,这意味着您无法为相同的ChangeID进行推送。

2) 您的工作流程不正确。您应该先执行git fetch origin,然后执行git rebase origin master & Commit和push。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接