我有一个问题是如何解决我在将我的代码提交到bitbucket的repo时所犯的错误。情况是我已完成前一个功能分支(Branch1)的工作,并将其拉入主分支。然后我继续为新功能创建一个新分支(Branch2)。
最终发生的事情是我创建了Branch2,但没有检查出来,所以我的更新最终被提交到branch1。
如何将这些更改从Branch1传输到Branch2?
包括令人敬畏的油漆图片:
答案 0 :(得分:3)
如果你还没有推动branch2
,这将是一种方法:
git checkout branch1 # make sure to be on the wrongly-modified branch1
git branch -d branch2 # remove the current branch2
git branch branch2 # create a new branch2 at the current spot
git fetch # make sure we're up-to-date on origin's pointers
git reset --hard origin/branch1 # reset branch1 back to what origin thinks it should be
git checkout branch2 # switch to branch2
# continue working on branch2
我知道打字很多,但概念上应该很容易理解。我发现有时候,即使我能找到一套较小的命令来完成某些事情,遵循逻辑上易于理解的方法也会更好,特别是当我正在处理一些我并不完全认为自己是专家的事情时......
答案 1 :(得分:2)
使用git rebase --onto:
git branch tmp-branch branch1
git rebase --onto branch2 tmp-branch^ tmp-branch
git branch -f branch2 tmp-branch
git branch -f branch1 branch1^
git checkout branch2
git branch -d tmp-branch
答案 2 :(得分:0)
这种情况一直在我身上发生,我总是必须寻找解决方法。
我们的一个项目很简单,有两个分支,即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*
只要您没有按下* ,我发现解决此问题的最佳方法如下:
$ 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*
因此,只需移动分支名称。使当前提交开发并重置主节点以指向原始/主节点:
$ git branch -f develop
$ git checkout origin/master
$ git branch -f master
$ git checkout develop
* 如果已按下,则最好的做法是通常使用git cherry-pick
将那些提交克隆到适当的分支。然后,您可以使用git revert
撤消在错误分支上推送的提交。
注意:很多时候,您会看到人们告诉您在重新设置基准之前先创建临时分支名称。这样可以避免使用git branch -f develop
,因为您可以使用merge来解决此问题,然后在推送之前删除临时分支。但是您仍然必须git branch -f master
,因为您已经使用提交进行了不正确的操作...最终,临时分支刚刚使我感到困惑,并且我已经拥有origin/FOO
引用名,它们与我已经使用的方式匹配考虑事物,所以我更喜欢直接使用它们。