Как объединить родительскую ветвь с сохранением дочерней ветки - PullRequest
3 голосов
/ 09 марта 2019

В настоящее время у меня есть ветвь от мастера, которая для целей этого вопроса мы будем называть «ветвь А».Я хочу разработать новую функцию, основанную на коде, который я написал в ветви A, но это важная функция, поэтому я хочу создать новую ветку.Давайте назовем этот новый филиал "филиал B".Мне нужно начать работу над веткой B, но ветка A будет объединена с мастером в какой-то момент после создания ветки B, но до того, как ветка B будет завершена.Есть ли способ сделать это, чтобы сохранить иерархию ветвей?Вот визуализация того, что я хочу:

До слияния:

_______ 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 Ответ

4 голосов
/ 09 марта 2019

Да , это можно сделать очень легко, поскольку здесь действует принцип слияния в действии.


Что делать?

Просто объедините 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 после слияния, но в любом случае мастер будет «содержать» * каждый коммит, кроме C9 и C10. (C11 - коммит слияния.)

И вы сможете продолжить работу над branchB, а затем объединить его с master (или нет, если на то пошло) в какой-то момент в будущем.

* (некоторые люди предпочитают эту метафору для концептуализации ветвей, но технически это просто означает, что все эти коммиты достижимы из кончика ветви через родительское отношение)

...