如何修复提交到错误的分支

时间:2013-07-11 12:27:36

标签: git bitbucket

我有一个问题是如何解决我在将我的代码提交到bitbucket的repo时所犯的错误。情况是我已完成前一个功能分支(Branch1)的工作,并将其拉入主分支。然后我继续为新功能创建一个新分支(Branch2)。

最终发生的事情是我创建了Branch2,但没有检查出来,所以我的更新最终被提交到branch1。

如何将这些更改从Branch1传输到Branch2?

包括令人敬畏的油漆图片:

awesome paint graphics

3 个答案:

答案 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引用名,它们与我已经使用的方式匹配考虑事物,所以我更喜欢直接使用它们。