Вытягиваете изменения из мастера в мою рабочую ветку?

16

Там двое из нас работают над чем-то. Мы используем эту структуру ветви

  • мастер
  • DEV-А
  • DEV-Б

Мы оба работаем над отдельными ветками (dev-A, B) и всякий раз, когда мы закончим, мы продвигаем наши изменения в мастер.

Но недостатком этого является то, что мы не можем получить изменения, которые делает другой разработчик. Все существует в главном дереве - но мы не можем получить последние обновления, сделанные другим разработчиком.

Есть ли способ решить эту проблему или мы должны изменить структуру нашей ветви (для каждой функции?)?

Уткарш Синха
источник

Ответы:

16

Я видел ветки разработчиков, используемые в двух основных сценариях:

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

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

Я не хочу, чтобы это было бессмысленным рассуждением о том, почему вам нужен CI, но из вашего вопроса ясно, что вы знаете, что не достаточно часто интегрируете свои изменения, поэтому IMO нет смысла танцевать вокруг этой проблемы.

Если вы на самом деле не работаете в географически распределенной команде с необходимостью «скрывать» изменения от внешних разработчиков, модель ветвления на разработчика действительно не имеет особого смысла. Это особенно не имеет смысла в git, потому что у каждого разработчика уже есть свой репозиторий. Большинство организаций должны интегрироваться очень часто - например, несколько раз в день.

В настоящее время я являюсь частью группы из примерно 35 участников, разделенных на 4 отдельные команды, большинство людей регистрируются как минимум 2-3 раза в день, некоторые - 10-15 раз; необычно видеть сломанные сборки, и они крайне редко остаются сломанными дольше нескольких минут. Git обрабатывает слияния в большинстве случаев так легко, что удаленные ветки разработчиков просто не нужны. Просто потяните, объедините локально и запустите коммит-тесты, прежде чем нажать, это просто.

Если вам абсолютно необходимо отложить интеграцию, чтобы защитить стабильность основной ветви, типичная, проверенная модель заключается в использовании нестабильной ветви - иногда называемой ветвью разработки , как описано в разделе Успешная модель ветвления Git . Если разработчики не могут успешно слиться с этой веткой (которую нужно только собрать , а не безупречно запустить) хотя бы раз в день, тогда у вас проблема качества / дисциплины, а не проблема контроля версий; покрытие этого с помощью неинтегрированных веток разработчика только устраняет проблему, и, таким образом, фактически делает возможные слияния намного более болезненными и нестабильными, чем они действительно должны быть.

Функциональные ветки не худшие, но очень немногие проекты IMO на самом деле достаточно велики, чтобы их оправдать; если ваш проект очень большой (т. е. одновременно выполняется множество функций), вы получите лучшие результаты от его разделения на отдельные автономные компоненты, чем от решения проблемы с контролем версий.

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

Aaronaught
источник
Я думаю, что важность непрерывной интеграции нельзя переоценить как в смысле интеграции всего в одну ветку, так и в смысле ежедневных / почасовых сборок (с использованием Jenkins или аналогичных).
Слеське
15

В вашей рабочей ветке, если вы идете:

git commit -am "Committing changes before merge"
git merge master

Вы также можете объединиться с веткой других разработчиков

git checkout dev-A
git merge dev-B

То, что это будет делать, это объединить изменения master с вашей веткой разработки.

scaryrawr
источник
Да, это один из способов. Я надеялся, что у Git будет элегантный рабочий процесс для этого.
Уткарш Синха
2
Что ж, git обычно работает лучше всего, если у каждого разработчика есть свой собственный локальный рабочий репозиторий и общий центральный репозиторий, к которому разработчики подталкивают и извлекают из него. Таким образом, каждый из вас может работать в одних и тех же ветках и получать обновления, извлекая и внося изменения, передавая их в центральный репозиторий. Это, вероятно, элегантность, которую вы ищете. Git будет обрабатывать слияние для вас автоматически, если нет конфликта. Git Flow - хорошее дополнение для рабочего процесса.
Scaryrawr
Perfecto. В некоторых местах есть несколько очень длинных ответов на этот точный вопрос, но git merge masterя искал ответ на ветке с проверенными функциями. Спасибо
Дренаи
3

Если dev-A и dev-B - разные ветки для разных проектов, то ответ @scaryrawr будет лучшим.

Но если dev-A и dev-B на самом деле представляют собой один и тот же код (один и тот же проект), то альтернативой будет то, что оба работают в одной из ветвей. Например, вы создаете ветку от мастера под названием «devWork». Вы оба проверяете devWork, работаете над ним, фиксируете и вносите изменения. Выдвинутые изменения были бы не на Master, а в devWork, тогда другим пользователям ветки просто нужно сделать PULL локально, чтобы получить сдвинутые изменения.

Затем вы можете следовать стандартным методам, чтобы вернуть работу на devWork обратно в Master и т. Д.

Дэвид "лысый имбирь"
источник