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

Gau*_*ani 5 git merge git-merge

我目前有一个 master 分支,出于这个问题的目的,我们将其称为“分支 A”。我想开发一个基于我在分支 A 中编写的代码的新功能,但它是一个重要的功能,所以我想创建一个新分支。我们称这个新分支为“分支 B”。我现在需要开始在分支 B 上工作,但分支 A 将在创建分支 B 之后但在分支 B 完成之前的某个时刻合并到 master。有没有办法做到这一点,以便保留分支层次结构?这是我想要的可视化:

合并前:

_______ master
  \________ branch A
       \________ branch B
Run Code Online (Sandbox Code Playgroud)

合并后:

_______ master (with branch A merged)
   \_______ branch B
Run Code Online (Sandbox Code Playgroud)

我基本上希望我的分支结构保持完整,但向上移动一个级别。

这是我不想发生的事情:

合并前:

_______ master
  \________ branch A
       \________ branch B
Run Code Online (Sandbox Code Playgroud)

合并后:

_______ master (with both branch A and branch B merged)
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Rom*_*eri 6

是的,它可以很容易地完成,因为它是这里的合并原则。


该怎么办?

只是合并branchAmasterbranchB将不在此合并的范围内。

git checkout master
git merge branchA
Run Code Online (Sandbox Code Playgroud)

为什么?

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

让我们想象一个更详细的例子:

C1-<-C2-<-C3-<-C4 <<< master
      \
       \
        C5-<-C6-<-C7-<-C8 <<< branchA
                   \
                    \
                     C9-<-C10 <<< branchB
Run Code Online (Sandbox Code Playgroud)

当您git merge branchAmaster分支执行时,git 将确定这两个分支之间的合并基础是C2. 然后它将检测C5, C6,C7C8作为提交不存在master但存在于branchA. C9并且C10没有理由被包括在内,因为它们无法从branchA.


事后情况

C1-<-C2-<-C3-<-C4-<--------C11 <<< master
      \                   /
       \                 /
        C5-<-C6-<-C7-<-C8 <<< branchA
                   \
                    \
                     C9-<-C10 <<< branchB
Run Code Online (Sandbox Code Playgroud)

您可以或不可以branchA在合并后处理您的,但无论如何 master 将包含*每个提交但C9C10。(C11是合并提交。)

并且您将能够继续工作,branchB然后master在将来的某个时刻将其合并(或不合并)。

* (有些人更喜欢用这个比喻来概念化分支,但从技术上讲,这只是意味着所有这些提交都可以从分支尖端通过父关系访问)