В git возможно ли объединить мастер с веткой, которая изначально была создана из мастера после добавления нового кода в мастер? - PullRequest
2 голосов
/ 27 июля 2011

Я не уверен, что это нормальный сценарий ветвления, но ...

предположим, что я создаю ветвь, скажем ветвь C, из master, а затем объединю другие ранее существующие ветки, скажем, ветки Aи B, обратно в master, и мне нужен некоторый код из A и B в ветке C, тогда я могу слиться с master в ветку C?

И если так, есть ли причины, по которым этого не будетхорошая идея?Это обычная операция в git?

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Это вполне нормальная операция.

git checkout C
git merge master

будет обычным способом сделать это (вы можете пропустить первый, если вы уже находитесь в этой ветке).

rebase Команда, упомянутая Алексом, является альтернативой, но имеет и другие результаты.(По сути, вы получаете более линейную историю для вашей ветви, но все старые коммиты на C до перебазирования (и после исходной ветки) теперь имеют другие имена (идентификаторы коммитов), так как они имеют коммиты в A и B вих предки.)

2 голосов
/ 27 июля 2011

Да и да.

Вы можете объединяться любым способом в git. Слияние просто означает «объединить эти истории». Когда git не может, его режим по умолчанию просто сбрасывает изменения на вас, «конфликт слияния», но вы также можете изменить это поведение, чтобы склониться к «нашим» или «их». Взгляните на git-merge документы для полного объяснения сотен вариантов ...

Итак, из вашего объяснения, диаграмма историй может выглядеть так:

*-------*-------*------* master
        |
        *----*-----* A
        |
        *-------* B
        |
        *----* C

Где * - это просто некоторый коммит в этой ветви, за исключением точки, в которой они все созданы. Итак, как вы решаете эту проблему? Ну, я бы:

git checkout A

Находясь на А, в основном мы собираемся объединить А в мастеринг следующим образом:

git merge master

есть веская причина для этого - когда представляем другому разработчику, предполагая, что слияние является точным, это представляет собой прямое слияние для быстрой перемотки вперед. Другими словами, объединить А с фактическим мастером в чужом хранилище становится проще. Теперь следующий шаг, который вы или другой разработчик могли бы сделать:

git checkout master && git merge A

Это тянет за собой А. В принципе, вообще не должно быть конфликтов слияния, поскольку процесс слияния мастера с А разрешил их, и разработчик, ответственный за интеграцию А, обработал его.

Итак,

git checkout B && git merge master

снова, разрешите проблемы слияния, затем git checkout master && git merge B

Наконец, вы говорите, можно ли слить master в C? Абсолютно. Мы только что проделали этот процесс дважды.

Мы используем этот особый способ ведения дел на работе. По сути, я заставляю других разработчиков сообщать мне, когда их ветки готовы, затем я объединяю их, затем все сливают мастера в свои ветви, и процесс повторяется. Вы даже можете сделать это с удаленными хранилищами. Если у вас есть отслеживание веток на пульте, git pull внесет ваши изменения. На самом деле это git fetch, за которым следует git merge, поэтому, если вы не отслеживаете чью-либо ветку, вы все равно можете применить объединение следующим образом:

Они могут сделать git merge leaddeveloper/master, где leaddeveloper - удаленное имя. Затем они могут исправить любые конфликты, отправив электронное письмо ведущему разработчику с просьбой «потяните», и ведущий разработчик может набрать git fetch && git merge juniordeveloper1/somebranch или, более вероятно, git fetch && git diff master..juniordeveloper1/somebranch, чтобы выяснить, что они сделали в первую очередь.

Короче говоря, это действительно хороший способ управления проектом. Он держит всех в курсе событий и гарантирует, что парень, работающий с главным мастером, также не выполняет интеграцию кода.

Что касается git rebase, этот вопрос решает его очень аккуратно.

1 голос
/ 27 июля 2011

Определенно нормальный сценарий.Вот что вы хотели бы сделать:

$ git checkout your-branch
$ git rebase master

Чтобы лучше понять перебазирование, вот пример.Допустим, это ваша история коммитов:

        H--I--J [branch C]
       /
A--B--C--D--E--F--G [master]

Как вы видите, мастер получил несколько новых коммитов с тех пор, как вы создали свою ветку.

Если вы перебазировали свою ветку против мастера, этоистория теперь будет выглядеть так:

                    H'--I'--J' [branch C]
                   /
A--B--C--D--E--F--G [master]

Теперь ветвь C обновлена ​​и включает в себя все изменения с тех пор, как вы изначально создали ветвь.1016 *

http://book.git -scm.com / 4_rebasing.html

http://kernel.org/pub/software/scm/git/docs/git-rebase.html

0 голосов
/ 19 ноября 2012

Если ветвь C не является широко используемой, которая извлекается из репозитория восходящего направления другим пользователем, я все равно предпочел бы подход rebase, упомянутый в Alex s answer .
Сначала перебазировать (C поверх master), объединить позже (C на master) .

Если у вас есть только некоторые коммиты A и B, которые вам понадобятся в C, cherry-picking будет решением, но, как я упоминаю в " Use Вилка / ветки GIT"(в конце), вишня имеет недостатки.

...