2

I have a question of how to fix a mistake I did when committing and pushing my code to our repo at bitbucket. The situation was that I had finished working on a previous feature branch(Branch1) and it was pulled into the master branch. Then i proceeded to create a new branch(Branch2) for a new feature.

What ended up happening is that I created the Branch2, but did not check it out so my updates ended up being committed to branch1.

How can i transfer these changes from Branch1 to Branch2 ?

Awesome paint picture included:

awesome paint graphics

4

3 回答 3

4

如果您还没有推送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

我知道要输入很多内容,但是从概念上讲应该很容易理解。我发现有时,即使我可以找到一组较小的命令来完成某事,遵循逻辑易于理解的方法会更好,特别是当我正在处理我不完全认为自己是专家的东西时......

于 2013-07-11T15:14:39.737 回答
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
于 2013-07-11T12:31:05.057 回答
0

这一直发生在我身上,我总是必须查找如何解决它。

我们的一个项目很简单,有 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考虑的事情相匹配的引用名,所以我更喜欢使用那些直接地。

于 2018-11-05T18:07:39.590 回答