如何合并父分支,同时保持子分支完整

时间:2019-03-09 11:31:36

标签: git merge git-merge

我目前有一个分支母版,出于这个问题的目的,我们将其称为“分支A”。我想开发一个新功能,该功能建立在我在分支A中编写的代码的基础上,但这是一项重要功能,因此我想创建一个新分支。我们将此新分支称为“分支B”。我现在需要开始在分支B上工作,但是分支B在创建分支B之后但在分支B完成之前的某个时间点将被合并到master。有没有一种方法可以保留分支层次结构?这是我想要的可视化效果:

合并前:

_______ master
  \________ branch A
       \________ branch B

合并后:

_______ master (with branch A merged)
   \_______ branch B

我本质上希望分支结构保持完整,但要向上移动一个层次。

这是我不想发生的事情:

合并前:

_______ master
  \________ branch A
       \________ branch B

合并后:

_______ master (with both branch A and branch B merged)

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

,由于这是此处合并的原则,因此可以很容易地做到这一点。


该怎么办?

只需将branchA合并到master中,branchB将不属于此合并范围。

git checkout master
git merge branchA

为什么?

Git将搜索这两者之间的合并基础(它们共享的最新提交),然后将应用端(此处为master中存在的每个提交应用于接收端(此处为branchA) )master没有。

让我们想象一个关于您的更详细的示例:

C1-<-C2-<-C3-<-C4 <<< master
      \
       \
        C5-<-C6-<-C7-<-C8 <<< branchA
                   \
                    \
                     C9-<-C10 <<< branchB

当您从git merge branchA分支执行master时,git将确定这两个分支之间的合并基础为C2。然后它将检测C5中没有提交但存在于C6中的提交C7C8masterbranchAC9C10没有理由被包含,因为它们无法从branchA到达。


之后的情况

C1-<-C2-<-C3-<-C4-<--------C11 <<< master
      \                   /
       \                 /
        C5-<-C6-<-C7-<-C8 <<< branchA
                   \
                    \
                     C9-<-C10 <<< branchB

合并后您不能处置branchA,但是无论如何,master都会“包含” *除C9C10以外的所有提交。 (C11是合并提交。)

您将可以继续进行branchB的工作,然后在将来的某个时候将其合并到master中(或者不是)。

* (有些人喜欢用这个比喻来概念化分支,但是从技术上讲,这仅意味着所有这些提交都可以通过父级关系从分支提示中到达)