我目前有一个分支母版,出于这个问题的目的,我们将其称为“分支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)
有没有办法做到这一点?
答案 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
中的提交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
中(或者不是)。
* (有些人喜欢用这个比喻来概念化分支,但是从技术上讲,这仅意味着所有这些提交都可以通过父级关系从分支提示中到达)