Чому б не здійснити невирішені зміни?


15

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

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

Можливість вчиняти під час процесу злиття має ряд переваг (як я бачу):

  • Фактичні зміни об’єднання є в історії.
  • Якщо злиття було дуже великим, ви можете робити періодичні комісії.
  • Якщо ви помилилися, було б набагато простіше відкати (без повторного повного злиття).
  • Файли можуть залишатися позначеними як невирішені, поки вони не будуть позначені як вирішені. Це не дозволить натиснути / тягнути.

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

То чому ж вчинення невирішених файлів нахмурюється / перешкоджає? Чи є якась причина, крім традиції?


1
Кого це нахмурило чи запобігло?
pdr

@pdr Деякі розробники, з якими я працював, нахмурилися. Принаймні hg 1.6після злиття файли позначаються як невирішені. hgбуде НЕ дозволить вам зробити , поки ви не помітивши їх як дозволені (не обов'язково означає , що ви на самому справі повинні вирішувати їх, але я припустив би , що це ідея).
Вибухові таблетки

1
Отже, під "невирішеними файлами" ви маєте на увазі "невирішені злиття"?
pdr

@pdr ні, hgнасправді підтримує список файлів, які мають або не були позначені як "вирішені" (використовуються hg resolve). Якщо Uв цьому списку є якісь файли, це не дозволить вам здійснити фіксацію.
Вибухові таблетки

1
hg resolveвикористовується спеціально для злиття з конфліктами; див. selenic.com/mercurial/hg.1.html#resolve . Note that Mercurial will not let you commit files with unresolved merge conflicts. You must use hg resolve -m ... before you can commit after a conflicting merge.
Майк Партрідж

Відповіді:


6

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

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


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

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

1
Git підтримує пакетні коміти.
deltree

3

Я найбільше знайомий з Git, тому я відповім на цю точку зору.

Я не бачу причини, чому ви або будь-який хороший VCS хотів би дозволити введення файлу без виправлення, особливо якщо це був код. Вам потрібно зберігати сховище у постійному стані, і те, що ви припускаєте, порушило б атомність. Багато VCS фізично змінюють файл, щоб показати, де конфлікти - Git, SVN та CVS використовують маркери типу >>>> <<<<. У VCS з атомним рівнем сховищ здійснює і зливається, ви просто створили б вузол, який не має сенсу ні для кого, крім вас. У розробці програмного забезпечення ваш проект не міг побудувати. У документі групи ніхто не знає, які зміни є правильними.

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

Конкретні проблеми щодо вашого списку переваг:

  1. Фактичні зміни об’єднання є в історії. Для чого потрібна додаткова інформація? DVCS дуже добре стосуються обмеження конфліктів обмеженими районами. Щойно ви виберете, який набір змін зберегти, порівняння копії вузла злиття з попередньою копією дасть вам саме це.
  2. Якщо злиття було дуже великим, ви можете робити періодичні комісії. Це важлива проблема, але ви ніколи не повинні потрапляти сюди в першу чергу. Гілки повинні постійно тягнути до змін вгору за течією, щоб цього ніколи не відбулося. Інструменти на кшталт rebaseабо збирання вишні одночасно можуть також допомогти вам у деяких ситуаціях.
  3. Якщо ви помилилися, було б набагато простіше відкати (без повторного повторного злиття). Дивіться вище - ваші конфлікти не повинні стати таким незмінним.

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


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

Msgstr "Вам потрібно зберігати сховище у постійному стані". Я не думаю, що це правда. Місцеве сховище - це робочий простір, а не святиня. Якщо це допомагає здійснити посеред злиття, зробіть це IMHO. Якщо ви це зробите, бо не знаєте нічого кращого, я б запропонував цього не робити. Якщо ви досвідчений програміст, вам слід робити все, що найкраще підходить для вас. Не будьте догматичними щодо збереження місцевого сховища незайманим.
Брайан Оуклі

1

Головний мій досвід - Mercurial, хоча я також використовую git епізодично.

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

Все, що вам потрібно зробити в Mercurial - це, як тільки ви матимете файли так, як ви хочете зробити їх:

hg resolve --mark --all
hg commit -m "I'm such a rebel"

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

Якщо ви хочете натиснути, не тягнучи (і, отже, зливатися з іншими змінами), зробіть як джедаї :

hg push --force

Наступний хлопець, який витягне, отримає +1 голову (каламбур не призначений)

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


1

Коли я зливаюся в git, я негайно здійснюю всі зміни (включаючи конфлікти злиття). Тоді, в наступному (ях) фіксації, я вирішую конфлікти злиття за допомогою текстового редактора. Після того як конфлікти будуть вирішені, я потім натискаю за бажанням.

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

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

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

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


0

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

Робити багато з відкритим кодом з git, найбільше розчарування для мене було отримання наполовину завершеного коду, накладеного на репо, та спроби зробити збірку, але не вдалося, бо хлопець зробив половину роботи і сказав: "Я зараз зайнятий , Я закінчу це через тиждень ». Тож я б у кінцевому підсумку мусив його зламати (що би дратувало хлопця), або знадобився час, щоб закінчити і повністю інтегрувати його.

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


0

Не будьте рабом своїх інструментів.

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

Однак не слід штовхати зламаний код за течією.


0

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

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

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

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

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