Как я отложил кучу незафиксированных изменений в процессе работы над чем-то еще

Если у меня есть куча незафиксированных изменений и вы хотите отложить его, работая над чем-то другим, а затем позже (f.i. через несколько дней) вернитесь к нему и приступайте к работе. Каким будет самый простой рабочий процесс для этого? (Пока у меня есть только опыт работы с базовыми функциями Mercurial). Мой обычный метод состоял в том, чтобы создать новую ветку с использованием клона, но могут быть и лучшие способы.

Ответ 1

У вас есть несколько вариантов:

  • Shelve. Это сохраняет изменения и удаляет их из рабочего каталога, чтобы ветка продолжалась. Он не создает набор изменений.

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

    Обновление/Редактирование. Более новые версии меркуриала, возможно, должны будут использовать

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

    Вы по-прежнему можете использовать --name в качестве альтернативы -n, но mercurial больше не похож на --name. Кроме того, --all больше не требуется, и ртуть будет на самом деле выходить из-под него.

  • Очередь patch с помощью mq. В некоторых отношениях это не слишком отличается от постов, но ведет себя по-разному. Конечный результат тот же, изменения удаляются и могут быть дополнительно повторно применены позже. При нажатии, патчи являются логическими наборами изменений, когда они выгружаются, они сохраняются в другом месте и не являются частью истории изменений.

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  • Зафиксируйте их локально, обновите предыдущий набор изменений и продолжите работу и используйте анонимные ветки (или несколько головок). Если вы хотите внести изменения, вы можете объединить головки. Если вы не хотите изменений, вы можете strip изменить набор.

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

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

Лично я использую опцию 3 или 4, так как я не против снятия наборов изменений или частичного кода проверки (до тех пор, пока это не будет в конечном итоге нажато). Это можно использовать в сочетании с новым материалом Phase, чтобы скрыть ваши локальные наборы изменений от других пользователей, если это необходимо.

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

Очереди Patch также являются общим механизмом для этого, но у них есть семантика стека. Вы нажимаете и поглаживаете патчи, но патч, который находится под другим патчем в стеке, требует, чтобы его тоже нажимали.

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

Ответ 2

Лично мне не нравится ни один из ответов, опубликованных до сих пор:

  • Мне не нравится ветвление клона, потому что мне нравится, что каждый проект имеет только один каталог. Работа над разными каталогами в то же время полностью уничтожает историю последних файлов моих редакторов. Я всегда меняю неправильный файл. Поэтому я больше этого не делаю.
  • Я использую shelve для быстрых исправлений (просто чтобы переместить мои неуправляемые изменения в другую ветку, если я понимаю, что я ошибаюсь). Вы говорите о днях, никоим образом не откладывайте что-то в течение нескольких дней.
  • Я думаю, что mq слишком сложна для такого обычного sittuation

Я думаю, что лучший способ - просто зафиксировать свои изменения, чем вернуться к набору изменений, прежде чем начинать эти изменения и работать оттуда. Есть некоторые незначительные проблемы, позвольте мне проиллюстрировать:

Скажем, у вас есть набор изменений A. Чем вы начинаете свои изменения. В этот момент вы хотите отложить его на некоторое время. Прежде всего, выполните свою работу:

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

Ответ 3

Чтобы сохранить локальные неуправляемые изменения, самый простой способ для меня - просто сохранить их как файл патча.

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

и когда вам нужно вернуться в предыдущее состояние:

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

Ответ 4

Вы можете просто клонировать свое репо несколько раз. Я имею тенденцию иметь клон корня, а затем несколько детей оттуда. Пример:

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

4 ребенка все клонируются из корня и push/pull в/из корня. Корень затем отжимает/тянет от мастер-репо в сети/Интернете где-то. Корень действует как ваша персональная зона постановки.

Итак, в вашем случае вы просто клонируете новое репо и начнете работать. Оставьте свою "отложенную" работу самостоятельно в другом репо. Это просто.

Единственным недостатком является использование дискового пространства, но если это было проблемой, вы бы вообще не использовали DVCS;) О, и это действительно загрязняет список ваших недавних проектов Visual Studio, но что это за эй.

[Изменить следующие комментарии]: -

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