Чи завжди в централізованому контролі версій добре часто оновлюватись?


9

Якщо припустити, що:

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

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

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

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

Чи залишаєтесь ви завжди корисно часто оновлюватись?


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

Чи забезпечує ваш CVCS зручний перегляд можливих конфліктів оновлення без зміни локальних файлів? TortoiseSVN має таку функціональність.
rwong


@gnat питання в тому, як часто оновлювати, а не здійснювати
janos

2
Питання дуже конкретно про те, як часто "оновлювати". І це вже частина припущень, які ваші товариші по команді роблять на ділі часто. Що, безумовно, гарна річ, але ні в якому разі не тема тут.
janos

Відповіді:


24

Особисто я щодня оновлюю свої локальні версії.

У сценарії, який ви описуєте, я б пройшов додаткову милю

  • Створення гілки для нової тривалої функції.
  • Часто зливайтеся з основної лінії до цієї нової гілки.

Сюди,

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

Недоліки, як я їх бачу, є

  • Об'єднання з основним повинно здійснюватися вручну (або за сценарієм)
  • Потрібно більше "адміністрації"

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

6
Походячи з Sourcesafe (де ми взагалі не зливалися) до TFS, git і mercurial (де ми часто зливаємось) , мій особистий досвід полягає в тому, що злиття часто створює набагато менше проблем, ніж очікування злиття великого удару. Я погоджуюсь, що це вимагає зрушення розуму від колег-програмістів. На моєму робочому місці я звучу як непрацюючий запис, але кожен повинен робити зобов’язання часто і часто оновлюватись.
Lieven Keersmaekers

6

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

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

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

Мантра, яку ви можете використовувати для запам'ятовування, така: "оновлення, оновлення, оновлення, здійснення". Завжди переконайтеся, що ваші зміни працюють з іншими перед тим, як зробити це. Це також для того, щоб переконатися, що перевірка коду працює вперше.


4

Третя точка в питанні просто неправильна :

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

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

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

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

Зазвичай у CVCS - це гарна ідея часто оновлюватись. Але якщо ви працюєте у відділенні, питання "часто оновлювати чи ні" стає "часто зливатися чи ні". І відповідь так чи інакше. Просто переконайтеся, що потрібно здійснити всі зміни, що очікують (у гілці), перш ніж об'єднатись з іншою гілкою, щоб ви могли безпечно відкрутити об'єднання, якщо вам доведеться.


2

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

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


1

Мені фактично зручніше використовувати розподілене керування версіями локально. Тобто я використовую git як клієнт-підривник. Це має ті переваги, що:

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

0

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

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

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

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


0

Чим він відрізняється від централізованого управління версіями, ніж для розподіленого?

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

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

До речі, я не знаю, що ви називаєте "зламати збірку". Я прагну працювати порівняно невеликим кроком, так що я зберігаю стан компіляції, навіть якщо це порушує деякі функції. І я запускаю тести, щоб я знав, що злиття не порушило те, що має працювати. Знову ж таки, легше виправити проблему, коли вона виявлена ​​рано.


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

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

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

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

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

0

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

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

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