Git - Какие проблемы возникают при работе напрямую с мастером?

25

Я видел много советов о моделях git-ветвления, и наиболее распространенное мнение состоит в том, что внесение изменений непосредственно в основную ветку - плохая идея.

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

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

linuxunil
источник
2
Определите «работать напрямую». Мастер существует, потому что он предназначен для использования. Как вы думаете, для чего это нужно, а для чего нет?
Candied_Orange
3
Работает ли мастер на вас? Если это так, то почему вы чувствуете необходимость измениться прямо сейчас? Если это не работает, с какой проблемой вы сталкиваетесь? Вместо того, чтобы просить людей указать вам на аргументы других людей, мы можем помочь вам решить ваши проблемы.
Томас Оуэнс
1
Похоже, он занимается разработкой соединительных линий, что, наряду с непрерывной интеграцией, вполне нормально для Agile-команды. Если он хочет работать так, вам нужно будет использовать WIP, чтобы гарантировать, что никогда не будет слишком много работы с одним продуктом одновременно, а также использовать переключение функций, чтобы гарантировать, что мастер может быть освобожден с отключенными неполными функциями.
Мистер Кочезе
... насколько велика команда?
ZJR
@MrCochese Я бы не назвал развитие магистрали в том смысле, как здесь, «нормальным». Конечно, ни одно из многих мест, где я использовал Git, не работало таким образом, и я бы не одобрял это. Функциональные ветки просто работают лучше.
Марнен Лайбоу-Козер

Ответы:

57

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

  • Если вы отправляете состояние незавершенного производства на удаленный компьютер, мастер может быть поврежден.
  • Если другой разработчик начинает работу над новой функцией от мастера, он начинает с потенциально нарушенного состояния. Это замедляет развитие
  • Различные функции / исправления не являются изолированными, поэтому сложность всех текущих задач разработки объединяется в одной ветви. Это увеличивает количество коммуникаций, необходимых между всеми разработчиками
  • Вы не можете делать запросы, которые являются очень хорошим механизмом для проверки кода.
  • Вы не можете раздавить коммиты / изменить историю git в целом, так как другие разработчики уже могли вытянуть основную ветку за это время.
Гернот
источник
11
Эй смотри! Вы на самом деле ответили на вопрос, в отличие от всех остальных. ++ Добро пожаловать в SE.SE!
RubberDuck
Большинство из них - проблемы, возникающие из-за плохой работы непосредственно с мастером , а не из-за непосредственной работы над мастером.
Муравей P
1
@AntP, какие проблемы можно предотвратить с вашей точки зрения?
Гернот
10

Объясните ему, что новым функциям нужна собственная ветка разработки, которую можно развернуть в тестовой среде, прежде чем она будет запущена в производство.

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

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

Роберт Харви
источник
«Вы не можете развернуть наполовину завершенные функции в производство» - это совсем не так - вполне возможно работать непосредственно с основной веткой, отправлять код при каждом коммите, часто развертывать «наполовину завершенные функции» и никогда ничего не нарушать , Непрерывная доставка - это как раз то, что нужно: отделить развертывание от выпуска. Это также помогает решить множество других организационных проблем, которые люди обычно решают с помощью полуразбитых технических решений. Иногда это включает переключение функций, но обычно можно создать и развернуть 90% функций без видимых изменений поведения.
Муравей P
@AntP: описываемый вами процесс - это не то, что я бы назвал «наполовину завершенными функциями». Такие функции либо тестируются, готовы к производству и могут использоваться, либо скрываются переключателем функций или чем-то подобным до тех пор, пока они не будут протестированы, готовы к производству и могут использоваться. Вы не отправляете функции, которые не работают.
Роберт Харви
Вы утверждали, что необходимо разрабатывать новые функции в ветвях, не являющихся основными, потому что вы не можете развернуть незавершенные: это не так. Вы, безусловно, можете разрабатывать новые функции непосредственно на главном компьютере и отправлять любой и весь код, связанный с этими функциями, в производство до того, как эта функция будет завершена, и не останавливайте другие разработки.
Муравей P
1
@AntP: у ветвей функций есть одна вещь, которую ваша техника не может обеспечить - это полный отчет о работе, проделанной над определенной функцией. В некоторых магазинах (в частности, в моем) такая ответственность - не роскошь, а требование.
Роберт Харви
1
@AntP Если я вас правильно понимаю, я бы посчитал это шагом назад. Мне нравятся хорошие трекеры, и я широко их использую, но я хочу, чтобы VCS рассказала мне историю развития любой функции или строки кода. Система отслеживания проблем может рассказать историю изменений в бизнесе , но если VCS не может помочь мне самостоятельно отслеживать и проверять код , то он не выполняет свою работу. Это одна из причин, по которой я возражаю против разработки на основе соединительных линий: это делает VCS глупым, потому что я не вижу никаких компенсирующих преимуществ. (Также: хрупкое соединение? Особенность - это изменение кода.)
Марнен Лайбоу-Козер
2

Мастер должен быть потенциально освобождаемым. Период. В мастере не должно быть никаких полу законченных работ (если не отключено с флагом функции)

При этом я видел, как некоторые команды усложняют свои выступления.

Не использовать PR при интеграции с мастером - ошибка, так как разработчики не могут выбирать, когда происходит интеграция.

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

Создание веток для каждой среды (dev, test, prod) является ошибкой. Это выходит за рамки git и должно обрабатываться конвейером выпуска. Точно такая же сборка должна быть развернута во всех средах, что невозможно, если для каждой среды существуют ветви.

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

Эсбен Сков Педерсен
источник
Я согласен с большей частью того, что вы сказали, за исключением следующего: «Точно такая же сборка должна быть развернута во всех средах». На самом деле конвейер выпуска должен, как правило, иметь возможность развертывать разные сборки в разных средах, а затем продвигать их по мере прохождения тестов. Как вы справляетесь с этим, если не с разными ветками (или хотя бы разными тегами)?
Марнен Лайбоу-Козер
Может быть, я не совсем ясно После того, как сборка развернута в среде. Те же самые артефакты следует развернуть в следующей среде без перестройки.
Эсбен Сков Педерсен
Если у вас есть повторяющиеся сборки, не должно иметь значения, перестраивать ли вы. Если у вас нет повторяющихся сборок, у вас есть большие проблемы. :)
Марнен Лайбоу-Козер
... но да, я думаю, вы должны пометить ваши развернутые коммиты, чтобы вы могли продвигать один и тот же код (независимо от того, перестраивали ли вы).
Марнен Лайбоу-Козер
Да, но большинство серверов CI могут связывать сборки с выпусками из коробки, что облегчает отслеживание развертываний. При правильной настройке нет необходимости отслеживать развертывание в git. Git это scm. Не инструмент развертывания.
Эсбен Сков Педерсен
2
  • Мастер должен отражать производственную ветку, рабочий окончательный вариант.
  • Работа непосредственно в master означает, что если вы создаете ошибки, у вас нет другого варианта «возврата», кроме как отменить / удалить / сбросить коммиты, что не является чистым способом работы и может привести к потере частей нового кода, которые были в порядке.
  • Конечно, на самых первых этапах разработки, возможно, вы можете начать работать непосредственно с мастером, но после того, как у вас есть что доставить, вы должны использовать ветки разработки, тестирования или эксперимента, чтобы не затрагивать опубликованную, полную, рабочую версию.
Тулаинс Кордова
источник
2

Во-первых, я хочу отметить, что в git каждая pullоперация push- это буквально операция ветвления, а каждая - слияние. Компьютер masterразработчика - это совершенно отдельная ветка от masterобщего репо, которым вы делитесь, с равным положением с технической точки зрения. Иногда я буду переименовывать мою локальную версию вupstream или что-то, если это лучше подходит для моих целей.

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

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

Во-вторых, это делает обзор перед слиянием очень сложным. На данный момент вам не нужно его убеждать. Вы можете использовать такой инструмент, как github, gerrit или gitlab, требовать проверки кода запроса на извлечение и прохождения автоматических тестов для всех слияний. Если вы не делаете что-то подобное, честно говоря, вы не используете git в полной мере, и неудивительно, что ваш коллега не видит такого потенциала.

Карл Билефельдт
источник
1
Также подталкивание разработчиков к его / ее ветке машины каждый день является хорошей резервной копией.
Ян
Я не понимаю вашу первую мысль. Я не вижу, как a pullсоздаст новую ветку или как pushоперация слияния. Скорее, pullэто совершенно буквальноfetch сопровождаемый merge!
mkrieger1
@ mkrieger1 Я легко вижу, как можно считать, что локальная masterветвь отличается от другой origin master. Технически, это разные ветви на двух разных пультах, каждый со своей историей.
RubberDuck
@RubberDuck Да, именно так. С pull: До: две ветви, потенциально указывающие на разные коммиты - После: две ветви, указывающие на эквивалентные коммиты - Не создано ни одной ветви, поэтому я бы не назвал это «операцией ветвления». Если любая из двух команд, я бы назвал pushэто, потому что это потенциально создает новую ветку в удаленном. Что он не делает, это слияние.
mkrieger1
@ mkrieger1 Вы должны также рассмотреть направление слияния.
RubberDuck
2

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

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

Есть ли у вас ветки функций, которые объединены в master, или у вас также есть разные ветки релизов, или вы используете совершенно другой процесс?

«Не используйте основную ветку» недостаточно.

Саймон
источник
2

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

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

Таким образом, в тандеме с «вы никогда не должны работать над мастером», у вас есть тесты функций, вы тестируете работу друг друга, вы просматриваете код друг друга? Приемочные и интеграционные тесты.

Если у вас нет ничего из вышеперечисленного, и вы просто делаете это, чтобы «сделать мерзавец», вы можете также поработать над мастером.

Питер Б
источник
1

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

Вопрос 1: должен ли ваш мастер представлять текущее состояние выпуска вашего программного обеспечения? Затем вы должны представить глобальную ветку разработки и объединить разработку в конце разработки релиза.

Вопрос 2: Хотите ли вы иметь процесс проверки кода? Тогда у вас должны быть «функциональные ветки», которые будут объединены с главной (или развиваться, если у вас есть) с помощью запросов на извлечение.

Вопрос 3: Нужно ли передавать промежуточное состояние кода другим разработчикам, которые еще не должны быть опубликованы в производстве (или тестировании)? В этом случае более чем один разработчик разрабатывает функцию. Затем вы должны ввести «функциональные ветви».

oopexpert
источник
Теги - это очень эффективный способ представления состояния базы кода при выпуске. Git позволяет очень легко оформить заказ конкретного тега. Делает DEV ветвь рода тоо.
RubberDuck