Git - Які проблеми виникають при роботі безпосередньо над майстром?


25

Я бачив багато порад щодо моделей розгалуження git, і, як видається, найпоширенішою думкою є те, що внесення змін безпосередньо на головну гілку - це погана ідея.

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

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


2
Визначте "працює безпосередньо". Майстер існує тому, що призначений для використання. Як ви думаєте, для чого це, а для чого це не?
candied_orange

3
Чи працює для вас майстер? Якщо це так, чому ви відчуваєте потребу змінити саме зараз? Якщо це не працює, яку проблему ви відчуваєте? Замість того, щоб просити людей вказувати вам на аргументи інших людей, ми можемо допомогти вам вирішити ваші проблеми.
Томас Оуенс

1
Здається, він займається розробкою стволів, що поряд з постійною інтеграцією є цілком нормальним явищем для команди Agile. Якщо він хоче працювати так, вам потрібно буде застосувати WIP, щоб переконатися, що ніколи не буде надто багато роботи над одним продуктом, а також використовувати комутацію функцій, щоб гарантувати, що майстер може бути звільнений із неповними функціями, вимкненими.
Містер Кохез

... наскільки велика команда?
ZJR

@MrCochese Я б не назвав розробку магістралі в сенсі тут "нормальним". Звичайно, жодне з багатьох місць, якими я користувався Git, не працював так, і я б відмовив від цього. Функціональні гілки просто працюють краще.
Marnen Laibow-Koser

Відповіді:


57

Існує декілька проблем, коли коміти безпосередньо підштовхуються до ведучого

  • Якщо натиснути стан незавершеного виробництва на віддалений, майстер потенційно зламається
  • Якщо інший розробник починає роботу над новою функцією від майстра, вона починає потенційно порушений стан. Це уповільнює розвиток
  • Різні функції / виправлення не виокремлюються, так що складність усіх поточних завдань розвитку поєднується в одній галузі. Це збільшує кількість комунікацій, необхідних між усіма розробниками
  • Ви не можете робити запити, які є дуже хорошим механізмом для перегляду коду
  • Ви не можете скасовувати коміти / змінювати історію git взагалі, оскільки інші розробники, можливо, вже витягнули головну гілку тим часом

11
Гей дивись! Ви насправді відповіли на питання, на відміну від усіх інших. ++ Ласкаво просимо до SE.SE!
RubberDuck

Більшість з них є проблеми , отримані від роботи безпосередньо на майстер погано , а не з роботи безпосередньо на майстер по суті.
Мураха P

1
@AntP, які проблеми можна було б запобігти з вашої точки зору?
Гернот

10

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

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

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


"Ви не можете розгортати на виробництві напівзавершені функції" - це зовсім не так . Безперервна доставка стосується саме цього: роз'єднання розгортання від випуску. Що трапляється також для вирішення багатьох інших організаційних проблем, з якими люди зазвичай вирішуються за допомогою напівзламаних технічних рішень. Іноді це стосується перемикання функцій, але зазвичай можна створити та розгорнути 90% функції без видимих ​​змін поведінки.
Мураха P

@AntP: Процес, який ви описуєте, - це не те, що я б назвав "наполовину заповнені функції". Такі функції або перевірені, готові до виробництва та зручні для використання, або заховані перемикачем функцій або чимось подібним до тих пір, поки вони не будуть перевірені, готові до виробництва та можуть бути використані. Ви не здійснюєте доставку функцій, які не працюють.
Роберт Харві

Ви запевняли, що нові функції потрібно розробити в не-головних гілках, оскільки ви не можете розгорнути напівфабрикати: це не так. Ви абсолютно можете розробляти нові функції безпосередньо на майстрі та відправляти будь-який і весь код, пов’язаний з цими функціями до виробництва, до того, як ця функція буде завершена і не затримує іншої розробки.
Мураха P

1
@AntP: Єдине, що має гілки функцій, які ваша техніка не може забезпечити, - це повний облік роботи, виконаної над певною функцією. У деяких магазинах (зокрема моїх) така звітність - це не розкіш, а швидше вимога.
Роберт Харві

1
@AntP Якщо я вас правильно зрозумів, вважаю, що це крок назад. Я люблю хороші трекери випуску, і я їх широко використовую, але я хочу, щоб VCS розповів мені історію розвитку будь-якої функції або рядка коду. Програма для відстеження проблем може розповісти історію зміни бізнесу , але якщо VCS не може допомогти мені відстежувати та перевіряти код самостійно, він не виконує свою роботу. Це одна з причин, що я заперечую проти розробки на основі магістралей: це робить VCS дурним, без компенсуючої переваги, яку я бачу. (Також: крихка муфта? Особливістю є зміна коду.)
Marnen Laibow-Koser

2

Майстер повинен бути потенційно звільненим. Період. Не повинно бути жодної напівзавершеної роботи в майстрі (якщо вимкнено прапор функції)

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

Не використовувати PR під час інтеграції в master - помилка, оскільки розробники не матимуть права обирати, коли відбувається інтеграція.

Єдина галузь розвитку приносить дуже мало значення. Зазвичай це просто ускладнює речі. Багато функціональних галузей приносить велику цінність.

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

Якщо функція настільки велика, її неможливо виконати за день чи два, вся робота з гілкою функції повинна бути в окремих гілках та інтегрована з PR.


Я згоден з більшістю сказаного, окрім цього: "Точну ж збірку слід розгорнути у всіх середовищах". Насправді, конвеєр випуску, як правило, повинен мати змогу розгорнути різні збірки в різних середовищах, а потім просувати їх під час проходження тестів. Як ви впораєтеся з цим, якщо не з різними гілками (або принаймні різними тегами)?
Марнен Лайбоу-Козер

Можливо, я був не зовсім зрозумілий. Як тільки збірка буде розгорнута до середовища. Ті ж артефакти повинні бути розміщені в наступному середовищі без перебудови.
Есбен Сков Педерсен

Якщо у вас є повторювані збірки, не має значення, чи відбудовуєтесь ви. Якщо у вас немає повторюваних збірок, у вас є більші проблеми. :)
Marnen Laibow-Koser

... але так, я думаю, ви повинні позначити свої розгорнуті комітети, щоб ви могли просувати той самий код (незалежно від того, перебудовуєте ви).
Marnen Laibow-Koser

Так, але більшість серверів 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

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

Це змушує мене вважати, що проблем більше. Робота над майстром чи ні - це здебільшого частина більшої філософії щодо того, як, що і коли випускаєте продукцію.

Тож у тандемі з "ви ніколи не повинні працювати над майстром", чи є у вас тести функцій, чи ви перевіряєте роботу інших, чи переглядаєте код один одного. Тести на прийняття та інтеграцію.

Якщо у вас немає нічого з перерахованого, і ви просто робите це, щоб "робити git", ви можете також працювати над майстром.


1

Немає «поганої практики» навколо роботи безпосередньо на гілці. Але ви повинні вирішити, що найкраще підтримує ваш процес:

Запитання 1: Чи повинен ваш майстер представляти поточний стан випуску вашого програмного забезпечення? Тоді вам слід запровадити галузь глобального розвитку та об'єднати розробку наприкінці розробки релізу.

Запитання 2: Ви хочете провести процес перегляду коду? Тоді ви повинні мати "функції гілок", які будуть об'єднані в головний (або розвинутий, якщо у вас є) за допомогою запитів на витяг.

Питання 3: Чи потрібно ділитися проміжним станом коду іншим розробникам, які ще не повинні бути опубліковані у виробництво (або тест)? У цьому випадку більше, ніж один розробник розробляє функцію. Тоді вам слід ввести "функції гілок".


Теги - це дуже життєздатний спосіб представити стан бази коду при випуску. Git дозволяє дуже легко перевірити певний тег. Робить галузь девісу суперечкою.
RubberDuck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.