Чи краще об’єднати "часто" або лише після завершення зробити велике об'єднання гілок функцій?


40

Скажімо кілька галузей розробляються, Aі B, а також крок за кроком гілка «виправлена помилка» C.

Тепер Cуже «закінчено» і злилося в майстер. Aі Bвони все ще знаходяться в розробці, і їх не буде виправлено до (можливо), інша гілка виправлення помилок об'єднана в головний.

Це гарна ідея Cякнайшвидше об'єднатись у нові функції гілок? Так що нові функції залишаються максимально наближеними master? Або краще дозволити новій функції розвиватися у власному «світі», лише зливаючись у головний, коли вони закінчені?

Так чи інакше виникнуть конфлікти, тому на їх виправлення потрібно витратити час.



5
@gnat, що стосується об'єднання гілок функцій в основну лінію, мені цікаво, чи добре об'єднання головної спини в функцію, коли функція розробляється, для "раннього вирішення конфліктів".
paul23

1
@ paul23, я б сказав, що це практична необхідність.
Берін Лорич

3
Чесно кажучи, дуже багато моїх проблем із версіями пішло, коли я почав використовувати належний дизайн свого коду, як ізоляція модулів та створення чітко визначеної моделі роботи. Якщо ви занадто сильно натикаєтесь на проблеми під час злиття, у вас може виникнути ще одна, більш серйозна проблема. Хороший дизайн неймовірно корисний для уникнення непотрібних конфліктів.
Т. Сар - Відновлення Моніки

2
Можливо, ви хочете регулярно зливатися з майстра, щоб залишатися близько "достатньо", щоб потім зробити злиття занадто болючим.
Thorbjørn Ravn Andersen

Відповіді:


71

Чим довше живе гілка, тим більше вона здатна відходити від основної гілки та месіє, і чим складніше отримане злиття буде, коли воно остаточно закінчено. Десять невеликих конфліктів простіше вирішити, ніж 1 масовий конфлікт, і фактично можуть заважати розробникам дублювати чи витрачати сили. З огляду на , що, ви повинні злитися masterв Aі Bрегулярно; раз на день - це досить поширена рекомендація, хоча якщо у вас є велика активність на ваших гілках, ви, можливо, захочете об'єднатися кілька разів на день.

На додаток до спрощення вирішення конфліктів, ви спеціально згадуєте Cгілку помилок. Як розробник, я хотів би, щоб у моєму відділенні були всі останні помилки, щоб я не повторював поведінку, що призвело до помилки, або писав тести на основі помилкових даних.

Так чи інакше виникнуть конфлікти, тому на їх виправлення потрібно витратити час.

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


33
Об’єднайте або перезавантажте , оскільки повторне завантаження часто створює більш чисту історію фіксації.
chrylis -на страйк-

11
@chrylis: звільнення може бути небезпечним, якщо "гілки висвітлюють неоднозначні історії" означають, що два розробники працюють на одній гілці.
Мерітон - страйк

9
@meriton з офіційних документів: Не перезавантажуйте комісії, які існують поза вашим сховищем, і люди, можливо, працюють на них. Якщо ви будете дотримуватися цієї інструкції, ви будете добре. Якщо ви цього не зробите, люди будуть ненавидіти вас, і ви будете зневажати друзів та родичів. LOL
Xtreme Biker

6
@XtremeBiker: Посилання в історії змін Git. У цьому плані Git працює як у реальному житті: щоб змінити історію, вам потрібна змова. У сховищі для самого Git є філія, яка регулярно перезавантажується, і вона є дуже публічною. Причина цього працює в тому, що існує змова: усі, хто використовує цю гілку, погоджуються переписати історію в певний час, тож вони переконаються, що зможуть все об'єднати до тих часів.
Йорг W Міттаг

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

11

Якщо припустити, що ви, зрештою, об'єднати A, B назад у головний і підтримувати єдину базу коду, ніколи не годиться занадто далеко відступати від майстра. Занадто довго відхилятися від master, особливо коли виправлення помилок та інша розробка зливаються з master, оскільки A, B розробляються, безумовно, спричинить конфлікти.

Я б розглядав стратегії, подібні до наступних

  1. Хто несе відповідальність за A, B повинен уважно стежити за майстром і зливатися в будь-яких змінах.
  2. А ще краще, якщо у вас є автоматизація побудови та тестування, переконайтеся, що A, B злилися в майстер і проходили тести щоночі.
  3. Виходячи з коментаря до іншої відповіді, здається, що A, B може зайняти деякий час, щоб розвинутись. У цьому випадку ви навіть можете вважати, що A, B зливаються один з одним, так що зрештою у вас не виникне великих проблем з об'єднанням обох назад у головний.
  4. На більш високому рівні подумайте, чому вам потрібні 2 окремі лінії тривалої розробки. Чи можете ви розбитись на менші злиття? Не могли б ви розбитись на окремі мікросервіси?

5

Зазвичай часто краще, ніж масивний.

Менші, частіші запити на тягнення майже завжди краще.

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

У створенні прапора конфігурації є додаткові накладні витрати, тому на менших функціях це не варто. Але тоді ваш запит на тягнення все одно буде невеликим.

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

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

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


1
Позначення прапорів може бути дорогим (450 мільйонів доларів за 45 хвилин). Цей приклад згадується також дядьком Боб (але без будь-яких технічних (як можна було б очікувати)).
Пітер Мортенсен

1
Так, можливо, їх врешті-решт видалити, хоча зазвичай це не так складно. Можна підтримувати їх довше, але тоді прапор забезпечує дещо більший вміст. Я погоджуюсь, якщо зробити це випадково або без подальшої діяльності, то все може піти погано. Хоча все може піти погано, коли великий запит на тягу стає важким для перегляду. З іншого боку, деякі люди можуть не в змозі додати щось, наприклад прапор конфігурації, до програми, в якій вони працюють. Як правило, це допомагає з UAT та випуском функції.
Марк Роджерс

3

У «Рефакторингу» Мартіна Фаулера порада, яку він дає, ніколи не дозволяє відгалужувати гілку від господаря довше, ніж на день. IIRC, вам слід зробити невелику зміну, протестуйте, щоб переконатися, що ви нічого не зламали, а потім з’єднайте її назад.


2
Ну Aі Bпровести основні радикальні нові ремонти того, як працює програма, вони не будуть "зроблені" протягом місяця. Однак вони також марні, перш ніж зробити це ...
paul23

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

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

2

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


1
Особливості прапорів = код зомбі (до воскресіння)?
Пітер Мортенсен

@PeterMortensen Ну, ви повинні прагнути видалити прапори якнайшвидше, але це може спрацювати в певних ситуаціях
Qwertie

3
@PeterMortensen не, якщо прапор увімкнено принаймні для однієї людини
Ян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.