如何在保持子分支完整的情况下合并父分支
How to merge a parent branch while keeping the child branch intact
我目前有一个 master 的分支,出于这个问题的目的,我们将其称为 "branch A"。我想开发一个基于我在分支 A 中编写的代码的新功能,但这是一个重要的功能,所以我想创建一个新分支。我们称这个新分支为 "branch B"。我现在需要开始处理分支 B,但是在创建分支 B 之后但在分支 B 完成之前,分支 A 将在某个时候合并到 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)
有没有办法做到这一点?
是的,很容易做到,因为这里是合并的原理
怎么办?
只需将 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
当您从 master
分支执行 git merge branchA
时,git 将确定这两个分支之间的合并基础是 C2
。然后它将检测 C5
、C6
、C7
和 C8
作为 master
中不存在但存在于 branchA
中的提交。 C9
和 C10
没有理由被包括在内,因为它们无法从 branchA
.
到达
之后的情况
C1-<-C2-<-C3-<-C4-<--------C11 <<< master
\ /
\ /
C5-<-C6-<-C7-<-C8 <<< branchA
\
\
C9-<-C10 <<< branchB
您可以在合并后处理或不处理您的 branchA
,但无论如何 master 将包含*每个提交,但 C9
和 C10
。 (C11
是合并提交。)
您将能够继续 branchB
的工作,然后在将来的某个时候将其合并到 master
(或者不合并)。
* (有些人更喜欢用这个比喻来概念化分支,但从技术上讲,它只是意味着所有这些提交都可以通过父关系从分支尖端到达)
我目前有一个 master 的分支,出于这个问题的目的,我们将其称为 "branch A"。我想开发一个基于我在分支 A 中编写的代码的新功能,但这是一个重要的功能,所以我想创建一个新分支。我们称这个新分支为 "branch B"。我现在需要开始处理分支 B,但是在创建分支 B 之后但在分支 B 完成之前,分支 A 将在某个时候合并到 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)
有没有办法做到这一点?
是的,很容易做到,因为这里是合并的原理
怎么办?
只需将 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
当您从 master
分支执行 git merge branchA
时,git 将确定这两个分支之间的合并基础是 C2
。然后它将检测 C5
、C6
、C7
和 C8
作为 master
中不存在但存在于 branchA
中的提交。 C9
和 C10
没有理由被包括在内,因为它们无法从 branchA
.
之后的情况
C1-<-C2-<-C3-<-C4-<--------C11 <<< master
\ /
\ /
C5-<-C6-<-C7-<-C8 <<< branchA
\
\
C9-<-C10 <<< branchB
您可以在合并后处理或不处理您的 branchA
,但无论如何 master 将包含*每个提交,但 C9
和 C10
。 (C11
是合并提交。)
您将能够继续 branchB
的工作,然后在将来的某个时候将其合并到 master
(或者不合并)。
* (有些人更喜欢用这个比喻来概念化分支,但从技术上讲,它只是意味着所有这些提交都可以通过父关系从分支尖端到达)