两个开发分支之间的Git Merging和Reparenting

时间:2017-11-09 23:34:33

标签: git merge version-control

我刚刚完成了两个独立的开发分支,这些分支最初是从主分支分支出来的。以下是我用于分支Master Branch以创建这两个开发分支的流程:

Master
  |--> DevelopBranch1
           |
            -->DevelopBranch2

最初我是通过DevelopBranch1分支创建Master的。然后我通过分支DevelopBranch2创建了DevelopBranch1。我做出此决定背后的原因是因为DevelopBranch2取决于我在DevelopBranch1中所做的新更改。

我完成了对DevelopBranch1的更改。由于DevelopBranch2最初并非Master分支,我现在想做一些事情:

1)将DevelopBranch1合并到Master

2)将DevelopBranch2重新归结为Master

3)将DevelopBranch2合并到Master

4)归档DevelopBranch1

我成功地将DevelopBranch1合并到Master,使用 SourceTree ,查看Master并将其与来自{{1}的最新提交合并}。

当我进入第2步时,这就是我遇到问题的地方。我使用以下git命令来Reparent:

DevelopBranch1

在rebase命令之后,我注意到在 SourceTree 中,git checkout master git rebase --onto DevelopBranch2 的最新提交已移至Master内的最新提交。

此时,我尝试将DevelopBranch2合并到Master。使用此Merge并运行DevelopBranch2后,我收到以下消息

git status

然后我跑了On branch master Your branch and 'origin/master' have diverged, and have 5 and 7 different commits each, respectively. (use "git pull" to merge the remote branch into yours) 并收到了这条消息:

git pull

这是我目前陷入困境的地方。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

由错误使用的命令git rebase --onto DevelopBranch2引起。让我们通过下面的图表来说明:

在step1(将DevelopBranch1合并到Master)之后,命令历史记录为:

...---A---B---C-------J       Master
           \         /
            D---F---G    DevelopBranch1
                 \
                  H--I   DevelopBranch2

如果您使用git rebase --onto DevelopBranch2命令,它会将当前分支Master重置为DevelopBranch2,如下所示:

...---A---B---C-------J      
           \         /
            D---F---G    DevelopBranch1
                 \
                  H--I   DevelopBranch2, Master

对于您的情况,您应该使用 git rebase --onto Master DevelopBranch1 DevelopBranch2 。然后它会将DevelopBranch2重新显示为Master分支,就像您期望的那样。

首先,您应该将Master分支重置为合并提交(提交合并DevelopBranch1Master),然后再次执行step2的命令。使用的命令如下:

git checkout Master
git reset --hard <merged commit id>
git rebase --onto Master DevelopBranch1 DevelopBranch2
git push origin DevelopBranch2 -f

然后step2将正确执行(如下图所示)。您可以继续执行step3和step4。

                        H'---I'  DevelopBranch2
                       /
...---A---B---C-------J   Master
           \         /
            D---F---G    DevelopBranch1