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


98

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

Відповіді:


133

У вас є кілька варіантів:

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

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    Оновлення / редагування : можливо, знадобиться використовувати новіші версії

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    Ви все ще можете використовувати --nameяк альтернативу -n, але меркурій, схоже, вже не любить --name. Крім того, --allце більше не потрібно, і меркурій насправді вигадує над ним.

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

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. Введіть їх на місцевому рівні, оновіть попередній набір змін і продовжуйте роботу та використовуйте анонімні гілки (або кілька заголовків). Якщо ви хочете зміни, ви можете об'єднати голови. Якщо ви не хочете змін, можна зняти набір змін.

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. Прив’язати їх до названої гілки. Потім робочий процес стає таким же, як і варіант 3 - злиття або смуга, коли ви будете готові.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

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

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

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

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


Дякуємо за чудову відповідь та корисні приклади. Чи знаєте ви, чи використання закладки hg також є варіантом?
Ерік

@Erik Можливо, але я не маю досвіду його використання.
Адам Холдсворт

2
закладки можуть бути використані, щоб допомогти із варіантом 3 - ви можете скористатись позначкою редакції, яку ви створили, щоб призупинити зміни. Вони не можуть виконати завдання самостійно.
Стів Кей

варіант --allне розпізнається. це поведінка за замовчуванням, щоб все-таки відкласти всі зміни.
naXa

@naXa Привіт, приятелю, якщо одна з моїх команд трохи не так (можливо, тому, що версія змінилася), будь ласка, відредагуйте відповідь, і я затверджую її за потреби :-)
Адам Холдсворт

23

Особисто мені не подобається жодна відповідь, розміщена до цих пір:

  1. Мені не подобається клонування розгалуження, тому що мені подобається, щоб кожен проект мав лише один каталог. Одночасно працюючи над різними каталогами, повністю перетворює історію останніх файлів моїх редакторів. Я завжди змінюю неправильний файл. Тож я більше цього не роблю.
  2. Я використовую shelveдля швидких виправлень (просто для переміщення моїх невмілих змін до іншої гілки, якщо я зрозумію, що я неправильна). Ви говорите про дні, ні в якому разі я б не відкладав щось на дні.
  3. Я думаю, що mqце занадто складно для такої звичайної ситуації

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

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

hg ci -m "Working on new stuff"

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

hg bookmark new-stuff

Поверніться до набору змін перед цими модифікаціями

hg update A

Звідси ви працюєте та генеруєте набір змін C. Тепер у вас є 2 головки (B і C), вас попередить, коли ви намагаєтесь натиснути. Ви можете натиснути лише на одну гілку, вказавши голову цієї гілки:

hg push -r C

Або ви можете змінити фазу new-stuffгілки на секретну. Таємні набори змін не будуть висунуті.

hg phase -r new-stuff --secret --force

Дякуємо за детальну відповідь! Мені дуже подобається читати робочі процеси людей щодо тих (звичайних?) Проблем.
Ерік

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

12

Щоб зберегти локальні незмінні зміни, найпростіший спосіб для мене - це просто зберегти їх як патч-файл.

hg diff > /tmp/`hg id -i`.patch

і коли вам потрібно повернутися до попереднього стану:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

Я б роздягнутися /tmpі , hg id -iі він буде працювати на Windoze теж.
anatoly techtonik

І hg upне потрібна там.
anatoly techtonik

1
@techtonik Що може статися, якщо я застосую виправлення на іншій версії? Особливо, якщо виправлені файли змінені.
mapcuk

Меркуріал намагатиметься злити його, і вам доведеться все-таки стикатися з конфліктом.
anatoly techtonik

6

Ви можете просто клонувати своє репо кілька разів. У мене, як правило, корінь клону, а потім декілька дітей звідти. Приклад:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

Усі 4 дитини клонуються з кореня і штовхають / тягнуть до / з кореня. Потім корінь штовхає / витягує з головного репо в мережі / Інтернеті десь. Корінь виступає у ролі вашої особистої області постановки.

Тож у вашому випадку ви б просто клонували нове репо і почали працювати. Залиште свою «поличену» роботу в спокої в іншому репо. Це так просто.

Єдиним недоліком є ​​використання дискового простору, але якщо це викликає занепокоєння, ви взагалі не будете користуватися DVCS;) О, і це все-таки забруднює список "останніх проектів" Visual Studio, але що таке.

[Редагувати наступні коментарі]: -

На закінчення ... те, що ви робите, є цілком нормальним і нормальним. Я б зауважив, що це найкращий спосіб працювати, коли це правда: 1) це недовговічність 2) вам не потрібно співпрацювати з іншими розробниками 3) змінам не потрібно залишати ваш ПК, поки не буде здійснено / час натискання.


Будь-яка причина не використовувати гілки? Це те, що вони є, і значно швидше, ніж повторне клонування.
Адам Холдсворт

У своєму запитанні я зазначив наступне: Моїм звичайним методом було створення нової гілки за допомогою клону, але можуть бути і кращі способи.
Ерік

1
@AdamHouldsworth, технічно це гілки ... просто недовговічні. Зробити названу гілку для недовговічної роботи зовсім нерозумно. Він зловживає цілями, названими гілками, які є для довговічних історій роботи.
nbevans

@NathanE Якщо ви вважаєте, що названі гілки для короткотривалої роботи "абсолютно нерозумні", то також існує анонімне розгалуження, стелаж чи черга з виправленнями, як інші легкі варіанти. Повторне клонування, на мій погляд, настільки ж дурне перед іншими варіантами - одна потенційна перевага - це відкриття двох наборів коду у двох екземплярах VS, але мені рідко доводиться це робити, використовуючи клони, як звичайно, це не так. Мене не служать. Тільки для уточнення я не був прихильником.
Адам Холдсворт

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