Рабочие процессы Git: изменение базы опубликованных/общих веток

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

Использование pull --rebase для меня теперь не проблема. Однако у нас также есть большие ветки функций, над которыми работают несколько человек. Периодически мы хотим вносить изменения, которые происходят на master. Здравый смысл подсказывает нам слияние, так как это общая ветвь. Однако в нашей одержимости перебазированием мы решили перебазировать эти ветки. Конечно, это требует сотрудничества всех. Рабочий процесс выглядит примерно так:

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

2) Ребазер перебазирует ветку функции на мастер, удаляет удаленную ветку функции (git push origin: функция), а затем отправляет новую, перебазированную ветку функции (функция git push origin).

3) Rebaser заставляет всех выбирать, что обновляет их ветку функций, затем удаляет их локальную ветку функций (функция git branch -D), а затем создает новую локальную ветку функций, которая отслеживает ветку удаленных функций. Затем все получают полную ясность.

Этот рабочий процесс работает отчасти потому, что мы небольшая группа, и перерывы в работе небольшие. Однако я беспокоюсь, что мы учимся плохим привычкам Git (перебазирование общей ветки) или что рабочий процесс не будет хорошо масштабироваться.

С другой стороны, история нашего репозитория прекрасна.

Что вы думаете, гуру Git? Мы играем с огнем или качаем разумный рабочий процесс?

ОБНОВЛЕНИЕ:

Прошло два года с тех пор, как я впервые задал вопрос, и с тех пор мой рабочий процесс изменился. Мы по-прежнему регулярно делаем git pull --rebase, так что ничего не изменилось. Это здравый смысл, и он предотвращает все неприглядные, запутанные мини-слияния. (Мы в основном синхронизируемся, поэтому git pull --rebase не требует больших затрат).

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

Наше решение состоит из нескольких компонентов:

  • Основная ветвь является «нетронутой». Тематические ветки объединяются, и после этого тематическая ветвь удаляется. Другими словами, слияние тематической ветки означает, что эта работа готова к производству и теперь является частью основной ветки. Глядя на нашу историю версий, становится очень ясно, что происходит: тематические ветки сливаются в главную, вот и все.

  • При необходимости используем одноразовые интеграционные ветки. Например, если у нас есть тематические ветки A, B и C, и ни одна из них не готова к интеграции в master, но нам нужно протестировать их вместе, мы просто создаем ветку QA (обычно вне master), а затем объединяем A, B и C in. В какой-то момент ветка QA удаляется или используется повторно. Дело в том, что она никоим образом не предназначена для постоянного использования и не имеет тех же ограничений, что и основная ветка (вы можете объединять свои тематические ветки столько раз, сколько хотите). Если история становится слишком запутанной, вы можете просто удалить ветку QA и начать заново (подход, который мы нашли очень естественным).

  • При объединении всегда используйте git merge --no-ff. Это такой огромный отход от нашей навязчивой идеи «линейной истории коммитов» двухлетней давности, что он заслуживает комментария. Теперь, когда мы смягчились в отношении линейной истории коммитов и увидели, что слияния — это хорошо и полезно, мы начали полагаться на тематические ветки, которые являются настоящими ветвями вне master. , а не просто серия коммитов, которая в итоге становится единой с master. git merge --no-ff гарантирует, что всегда будет фиксация слияния, даже если в этом нет необходимости.

  • У нас есть хорошо понятное соглашение для сообщений коммитов и веток, и, что более важно, в нем есть перекрестные ссылки на нашу систему отслеживания проблем. Наша система отслеживания проблем использует числовые номера проблем, и для любой функции (или дефекта) у нас есть номер проблемы (например, 1234). Если вы работаете над этой проблемой, вы должны создать ветку _1234 и начинать каждое сообщение коммита с "_1234: doing blah blah". Это может показаться немного навязчивым, но это действительно хорошо сработало для нас и значительно уменьшило/устранило путаницу.

  • Используйте оболочку git, чтобы стимулировать прилипание рабочего процесса. Это то, над чем мы в настоящее время работаем, но мы поняли, что это совершенно необходимо для предотвращения простых и понятных ошибок, таких как ответвление от неправильного (недавно у нас была полная катастрофа, когда разработчик создал ветку темы из одноразового Ветвь QA: эта тематическая ветка была одобрена для запуска, она была объединена... и куча изменений, которые не были одобрены для запуска, были втянуты). Наша оболочка git потребует подтверждения всякий раз, когда вы делаете что-то необычное (например, создаете ветку чего-либо, кроме master, создаете ветку без имени _NNNN, делаете коммит, который не начинается с _NNNN и т. д.). Иногда нам нужно делать эти вещи, поэтому оболочка не предотвращает это, но не дает людям случайно сделать что-то, чего они не должны.


person Ethan Brown    schedule 08.03.2012    source источник
comment
Я думаю, что это слишком. Если ваша функциональная ветка такая долгоживущая, вам следует делать слияния. В противном случае вы получите все ваши прошлые коммиты от master до головы вашей функциональной ветки, на которых не были запущены тесты. Ваша история также оказывается очень не репрезентативной для того, что произошло на самом деле.   -  person Andrew Marshall    schedule 08.03.2012
comment
Что ж, этот Используйте оболочку git для поощрения интеграции рабочего процесса является краеугольным камнем. Вы больше не используете git. Вы используете свою обертку.   -  person horsh    schedule 29.07.2014
comment
Привет, ваши шаги с 1 по 3 точно совпадают с моими мыслями, но, чтобы прояснить ситуацию, вы все еще используете эти 3 шага в данный момент? Я боюсь неправильно понять любую из ваших новых правок.   -  person Marson Mao    schedule 08.10.2014
comment
Привет, Марсон, редко когда мы делаем 1-3. Наше увлечение rebase закончилось. Мы узнали, что догматическое стремление к линейной истории коммитов ошибочно. Мы по-прежнему предпочитаем git pull --rebase и перебазируем для исправления проблем рабочего процесса, но большую часть времени мы объединяем ветки.   -  person Ethan Brown    schedule 08.10.2014


Ответы (1)


Это звучит так, как будто это слишком сложно и не будет хорошо масштабироваться. Вероятно, намного проще просто периодически объединять master с вашей функциональной веткой, а затем, когда придет время снова объединиться с основной, тогда вы можете сначала выполнить перебазирование (чтобы удалить промежуточные ненужные слияние) и слияние обратно в мастер (предположительно с --no-ff для создания коммита слияния). Это требует, чтобы только один человек имел дело с перебазированием, и ему не нужно было выполнять какую-либо координацию, потому что никому больше не нужно ничего принудительно обновлять (потому что, предположительно, ветка будет удалена после ее слияния, а не сохранена в переписанное состояние). Вы также можете решить полностью пропустить перебазирование и просто оставить промежуточные слияния на месте, что более точно отразит ваш рабочий процесс разработки и устранит риск создания коммитов, которые на самом деле не собираются.

person Lily Ballard    schedule 08.03.2012
comment
Верно ли, что в этом случае любые конфликты, разрешаемые при слиянии master с веткой функций, должны разрешаться еще раз при перемещении? (Наоборот, я вижу, насколько это очень удобный рабочий процесс, если вы не ожидаете конфликтов слияния) - person rethab; 01.06.2016
comment
@rethab: если вы включите rerere (проверьте git help rerere), он сможет разрешить их автоматически, в зависимости от того, сможет ли он правильно идентифицировать конфликт как конфликт, который он разрешил в прошлом. - person Lily Ballard; 02.06.2016
comment
Почему вы говорите: чтобы удалить промежуточное ненужное слияние. Слияние с мастером может потребоваться для использования некоторых новых API и т. Д. Я думаю, что слово «ненужное» следует удалить из ответа. - person cryptickey; 24.05.2021