这一直发生在我身上,我总是必须查找如何解决它。
我们的一个项目很简单,有 2 个分支,master 和 devel。Master 是我们构建发布、提交反向端口等的地方。 devel 是大部分工作发生的地方。我通常是构建生产版本的人,所以在发布后,我经常在我期望开发检出时进行主检出。
基本上我最终得到了这个:
o---o---o---o---o origin/master
| / \
| / o'--o'--o' *master*
\ /
o---o---o---o---o origin/develop
我想要的是:
o---o---o---o---o origin/master master
| /
| /
\ /
o---o---o---o---o origin/develop
\
o'--o'--o' *develop*
只要您还没有 push*,我发现解决此问题的最佳方法如下:
$ git checkout develop
$ git rebase --onto develop origin/master master
将此视为git rebase --onto DESTINATION STARTING_FROM ENDING_AT
. 这给了我几乎想要的东西,但是分支名称“master”已经被移动,分支名称“develop”没有被推进。“master”当前已签出。
o---o---o---o---o origin/master
| /
| /
\ /
o---o---o---o---o origin/develop develop
\
o'--o'--o' *master*
因此,只需移动分支名称。使当前提交开发并重置 master 以指向 origin/master:
$ git branch -f develop
$ git checkout origin/master
$ git branch -f master
$ git checkout develop
*如果你已经推送了,那么最好的办法通常是git cherry-pick
将这些提交克隆到正确的分支。然后,您可以使用git revert
撤消在错误分支上推送的提交。
注意很多时候你会看到人们告诉你在做 rebase 之前创建临时分支名称。这将使您避免git branch -f develop
, 因为您可以使用合并来修复它,然后在推送之前删除临时分支。但是你仍然必须git branch -f master
导致你已经通过提交不正确地推进了......最终,临时分支只是让我感到困惑,我已经有了与我已经在origin/FOO
考虑的事情相匹配的引用名,所以我更喜欢使用那些直接地。