Чи часто виникають складні конфлікти злиття - ознака проблем?


35

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

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

Чи правильно я думаю про це? Чи є складні конфлікти злиття ознакою чогось доброго чи поганого?


1
Як довго тривають функції? Наскільки добре модульований код? Не могли б ви (наприклад) вибрати вишневе в тесті коду (це було зроблено спочатку і відокремити від фактичного коду, правда?), Щоб побачити, як змінилась функціональність?

@MichaelT Кодова база призначена для нашої автоматизованої бази тестових кодів. Ми збираємось розпочати роботу над новим доповненням до нашого проекту, яке, швидше за все, потребує трохи паралельної розробки. Звідси обговорення функціональних гілок проти інших.
joshin4colours

7
Чи насправді люди стикаються з подібними проблемами, чи вони просто бояться, що ці проблеми можуть з’явитися?
Крістофер Кройцгіг

2
До речі, ДУМОВИЙ підручник ви зв'язали :)
Vorac

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

Відповіді:


23

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

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


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

1
Факт, що наша кодова база є дещо "молодою" (приблизно 6 місяців, через кілька основних рефакторів), може бути індикатором цього.
joshin4colours

10
@ joshin4colours Якщо ви займаєтеся рефакторингом, коли хтось пише велику функцію, у вас виникають проблеми.
Шон Мак-Що-то

17

Я звик до робочого процесу "fetch-rebase-push". Насправді це перший, найпримітивніший робочий процес, описаний у вашому підручнику. Ось такі переваги:

  • Справжня безперервна інтеграція
  • Раннє управління конфліктами - відразу після того, як один написав і протестував код
  • Швидка відповідь - "Гей, Бобе, кубічна інтерполяція, яку ти написав, дає смішний вихід, ти можеш поглянути на це, поки я в обід?"
  • Жодних об'єднань не робиться - чиста хронологія як би один розробник написав everithyng

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

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


1
Чудовий опис хорошого робочого процесу Git, але це не зовсім відповідає моєму питанню.
joshin4colours

2
@joshy це правда. Лише середній абзац вирішує ваше питання. Але ось пряма відповідь. Якщо об'єднання є частим і складним, то це, безумовно, є вказівкою на проблемний робочий процес / проблему комунікації / проблему / поділ архітектури або проблему ролей.
Vorac

7

Злиття та знижки повинні викликати абсолютно однакові конфлікти для тих притаманних конфліктів, які людина повинна вирішити (тобто два розробники, що змінюють один і той же рядок коду). Для інших конфліктів злиття насправді є більш чистими, оскільки ви не змінюєте SHA-1 комітетів у всіх місцях. Я не впевнений, як вам вдасться потрапити в стан, коли злиття викликають більше конфліктів, ніж знижки, але це, безумовно, знак того, що робочий процес у деяких людей заплутаний, і їм, ймовірно, потрібна додаткова підготовка щодо того, як працює git. Чи вони видаляють комісії для злиття інших людей, коли вони роблять свої місцеві знижки, чи щось подібне?

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

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


5

Проект, над яким я працюю, час від часу має подібні проблеми, і, здається, це є наслідком пари факторів:

  • Ми використовуємо Visual Studio і такі файли, як Visual Studio .sln - це лише документи XML (які не дуже добре реагують на текстові злиття), наповнені Посібниками (які Git не може зрозуміти краще, ніж інші). погано зрощені та призводять до втрати файлів.
  • Деякі люди працюють над подібними ділянками коду, так що зміни, які випливають, можуть бути прямо поруч із класами. Хоча в цій ситуації неминуче, цей тип конфігурації буде дуже важкою роботою для будь-якої системи управління джерелами. Навіть якщо у вас є велике спілкування у вашій команді, іноді люди не усвідомлюють, що натрапляють на код один одного і виникають конфлікти.

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


4

Якщо розробники не змінюють історичні зобов’язання (замість чистих об'єднань), конфлікти в функції функції git типу робочого процесу є ознакою щільно зв'язаної кодової бази (/ brandnew codebase) або перекриття присвоєння функції.


0

У вас є головна (головна) галузь, і всі працюють у своїх галузях функцій.

Робота в галузях можливостей може зайняти від кількох годин до кількох місяців.

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

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


1
Злиття в основну галузь ніколи не повинно мати конфліктів. Ви завжди з’єднуєте головне з функцією спочатку, тож функція основного потім конфліктна.
gnasher729

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

Він сказав, що "у вас швидше виникають конфлікти, що зливаються від функції до майстра"
gnasher729

0

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

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