Чи так суттєвим є git "Золоте правило звільнення"?


22

Нещодавно у мене була дискусія з людьми, які абсолютно протистоять стратегії перезавантаження функціональних галузей на GIT. Здається, прийнятою схемою є використання бази даних лише для локальних, приватних відділень, але ніколи не використовувати її, коли кілька людей працюють над однією і тією ж особливістю та гілкою, як згідно з цим так званим "золотим правилом звільнення" (як пояснено тут: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Я просто здивований, що щодо цього існує консенсус. Я працював 3 роки з повною стратегією звільнення, приблизно 20 розробників працювали на togeteher і здогадуєтесь, що це спрацювало.

В основному процес:

  • Ви створюєте свою функціональну галузь, назвемо її "мійфаутера" і підштовхуємо її до походження / міфеатури
  • Інші люди можуть перевірити це і працювати над ним
  • Ви можете іноді перезавантажити його від master: from "myfeature", git rebase origin / master ; а потім, так, ви повинні натиснути на це.
  • Що станеться, коли інші люди хочуть просунути свої зобов'язання? Вони просто перезавантажують це: походження git rebase / myfeature . Тож вони зараз перемотаються вперед і можуть натискати, не змушуючи їх.

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

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

Отже, чому це «Золоте правило ребазу» настільки широко прийняте? Чи є щось інше, що я пропустив з цим? Я розумію, що потрібен мінімум організації (кожна стратегія вимагає певної організації), але вона працює.


Щось я забув сказати, але це має своє значення: в моєму попередньому досвіді ми використовували герріт як інструмент перегляду коду. Це означає, що якщо хтось натискає на зобов’язання, коли власник філії робить ребайт, немає ніякого ризику, що комісія загубиться, оскільки вона буде натиснута на gerrit замість безпосередньо до сховища початківців. А оскільки власник філії - єдиний, хто має право подавати зобов’язання від геррі, ризик помилитися був дуже низьким.
Джоель

що робити, якщо я об'єднаю чужу галузь функції у свою власну?
Вінстон Еверт

Якщо ваша функція залежить від іншої, то, мабуть, ви могли б перезавантажити свою програму з іншої: git rebase origin / otherFeature (я кажу, що ребазація, а не злиття, оскільки мета - зберегти історію лінійною). Я визнаю, що складність усього, що значно збільшується, коли ти впроваджуєш все більше залежностей між гілками.
Джоель

Відповіді:


10

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

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

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


Можна, звичайно, підтягнути майстер, перезавантажити, а потім примусити натиснути, але це не атомно.
Кевін

@gbjbaanb Ви абсолютно праві, стратегія відмови - це все щодо стильових причин / більш читаної історії. Я не намагаюся стверджувати, що краще, чи ні. Але це можна зробити, і це я хочу підняти. Звичайно, я говорив не про силовий натиск на майстра, а лише про особливі гілки.
Джоель

4
IMHO конструктивна особливість як ребаза, так і швидкого злиття вперед була помилкою. SCM - це збереження історії, щоб ви могли бачити, що сталося, коли вам потрібно, і робити знімки для відповідних моментів. Принаймні, саме цього хочуть більшість людей, я думаю, Лінус хотів, щоб історія була якомога простішою для того, щоб він міг прочитати, а тому вклав їх у свою користь. ІМХО він мав би докласти більше зусиль для того, щоб зробити відмінності між двома редакціями більш керованими замість цього (тобто дозволяючи перегляду бути простішим, а не базовою історією)
gbjbaanb

2
Коли ви публікуєте документ, чи публікуєте ви перший проект? Чи існує якийсь закон, який говорить про те, що інструменти, які ви використовуєте для написання першої чернетки, не можна використовувати для редагування для публікації? Git - це інструмент розвитку. Якщо ви хочете надійно та достовірно зберегти серію, збережіть її. Якщо ви хочете замість цього відредагувати його для публікації, відредагуйте його. Зірка Гіта в обох завданнях.
jthill

5

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

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

З огляду на те, що результати "дуже мало людей здійснюють перезавантаження та примусовий поштовх", не дуже дивно.

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


3
"ей, ніхто не натискає на деякий час, я мушу виправити ..." .. звучить як у старі часи використання Visual Source Safe. Я думав, що git кращий за це.
gbjbaanb

Так, таким чином люди створюють правила на кшталт "не грай гострими інструментами! (Натискання силою)" Так вони можуть уникнути лікування ран, які можна уникнути!
Смуги

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

4
Добре, що це помилка інструменту. Git виявляє багато гострих країв, і хоча іноді зазначає, що вони гострі, часто це не відбувається. Якщо ви порівняєте це з вимовою CVS, де всі гострі біти є в підкоманді SINGLE ("cvs admin"? Це минуло деякий час ...), що виходить з шляху, щоб сказати, "це може порізати вас погано, не варто використовуйте його, якщо у вас немає гострої потреби ". Або інші системи управління версіями, які опускають можливості, які можуть завдати шкоди.
Смуги

4
Це не означає, що git не зробив правильного дизайнерського вибору (груповий функціональний зв'язок підкоманди, і вважають за краще дозволяти git вирішувати складніші речі в потрібних руках) ... але це ВИБОРИ, і можна критично ставитися до вибір такої кількості гострих країв, як, наприклад, один може бути критично важливим для вибору інших ДКС, щоб залишити безліч корисних функцій, "тільки тому, що хтось може поранитися".
Смуги

2

Щоб додати інший голос:

Так, якщо ви працюєте так, як ви описуєте, немає проблем із використанням rebaseта натисканням на силу. Критичний момент: у вас є домовленість у вашій команді.

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

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


Зауважте, що сам проект git також робить щось подібне: вони мають галузь інтеграції, яку регулярно відтворюють, називається "pu" ("запропоновані оновлення"). Задокументовано, що ця галузь відтворюється регулярно, і що ви не повинні базувати на ній нову роботу.


1

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

Причина того, що користувачі Git схильні уникати спільної історії змін, полягає в тому, що немає автоматичного уникнення та усунення цих проблем. Ви повинні знати, що ви робите, і вам доведеться все виправити вручну, якщо ви зіпсуєте. Дозволити рівно одній людині робити силовий натиск - це не інтуїтивно і всупереч розподіленому дизайну Git. Що станеться, якщо ця людина поїде у відпустку? Хтось ще тимчасово володіє філією? Звідки ти знаєш, що вони не будуть ходити по всьому тому, що робив початковий власник? А у світі з відкритим кодом, що відбувається, якщо власник філії поступово відходить від громади, не офіційно залишаючи її? Ви можете втратити багато часу в очікуванні передачі права власності на філію комусь іншому.

Але справжнє питання таке: Якщо ви зіпсуєте і не відразу зрозумієте цього, старі зобов’язання з часом зникнуть після того, як пройде достатньо часу. У цей момент проблема може бути невиправленою (або, принаймні, потенційно дуже складно відновити, залежно від того, як виглядає ваша історія резервного копіювання - ви створюєте резервну копію старих копій вашого сховища Git, тобто не просто клонів?).

Контрастуйте це з роботою Mercurial's Changeset evolution (яка, зауважу, ще не закінчена або стабільна). Кожен може вносити будь-які зміни в історію, що їм подобається, за умови, що набори змін не будуть позначені загальнодоступними. Ці поправки та знижки можна висунути та витягнути з усієї безкарності, не потрібно власника філії. Жодні дані ніколи не видаляються; весь локальний сховище додається лише для додавання. Набори змін, які більше не потрібні, позначаються застарілими, але зберігаються нескінченно. Нарешті, коли ви зіпсуєте свою історію (що трактується як нормальна частина вашого повсякденного робочого процесу), є витончена команда автоматично очистити її. Цього типу очікують люди, що не користуються послугами UX, перш ніж переймати модифікацію спільної історії.


Я погоджуюся з цією "філософією git", і я також думаю, що філософію іноді можна зламати :). Більш серйозно, як я зазначив у коментарях, це вже 3 роки тому, я був у конкретному випадку, коли герріт був інструментом перегляду коду, який виступав як фактичний інструмент резервного копіювання, запобігаючи такі потенційні драматичні втрати. Тепер я все ще думаю, що відновлення даних буде нормальним, коли ви впевнені, що "контролюєте" гілку. Навіть у проекті з відкритими джерелами, якщо я розробляю функцію та відкриваю запит на тягнення, я "володію" цим PR, я вважаю, що маю право на відновлення його відділення, до мене не варто ебати свою роботу під час перезавантаження ... (1/2)
Джоель

... і якщо деякі люди хочуть внести зміни в цей PR, то я вважаю, що вони повинні мені сказати спочатку, і це питання спілкування. (2/2)
Джоель

PS: спасибі за посилання Changeset evolution, що цікаво
Джоель

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