Могу ли я вернуть диапазон строк в файле с меркуриальным?
Я часто замечаю несколько нежелательных изменений, когда просматриваю свою рабочую копию (с hg status
и hg diff
) прямо перед фиксацией. Например, я мог бы временно добавить или удалить некоторый код только на время сеанса отладки.
Я знаю, что я могу использовать hg revert
для удаления нежелательных изменений, но это удаляет все изменения во всем файле. Есть ли способ вернуть только часть файла?
Ответы
Ответ 1
Один из способов - использовать графический инструмент сравнения, например kdiff3
. Если вы кормите его diff и выберите "слить текущий файл", вы можете пойти по очереди и выбрать то, что хотите.
Лучше всего совершать более часто. Если вы делаете привычку совершать право до добавления кода отладки, то либо добавляйте, либо отменяете свой код отладки перед добавлением своего "реального" кода, поэтому очень легко удалить ваш код отладки, потому что он имеет свою собственную ревизию. Кроме того, вы можете полностью отложить свой отладочный код в отдельной ветке.
Ответ 2
Я не уверен, что вы можете явно отменить отдельные строки, но то, что я делаю в такой ситуации, как ваша, - это сделать хороший код и вернуть остальное (плохой код). Этот рабочий процесс прост, используя Mercurial record или crecord (я рекомендую последний).
Ответ 3
Предполагая, что у вас есть record и shelve, вы можете сделать следующее:
hg record -m "garbage" # pick out and commit the change you want to revert
hg shelve --all # temporarily hide other changes
hg strip tip # remove the garbage changeset
hg unshelve # restore the changes you want to keep
Ответ 4
TortoiseHg В окне "Commit" в графическом интерфейсе есть вкладка "Выбор Hunk", которая позволяет выбирать отдельные разделы файла для изменения быть совершенным.
Ответ 5
У меня есть другой ответ на вашу проблему, которая есть та же проблема, что и у меня. Это отличный вариант для меркурийных очередей!
Когда я собираюсь начать добавлять код отладки к изменению, которое, как я думаю, готов, я делаю следующее:
hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit
hg qnew -m "debugging" dbg.patch # prepare the next changeset at the tip
[add my debugging]
hg qrefresh # update the changeset at the tip
[...]
hg qpop # pop the debugging off the repo history
Требуется немного привыкнуть - вам придется переупорядочить ваши патчи, а затем свернуть все исправления, сделанные вами в исходном патче работы.
Кроме того, проверьте расширение чердака Bill Barry. На этой странице рассказывается о том, как использовать его для нескольких разных рабочих процессов и как это сравнивается с использованием mq. https://www.mercurial-scm.org/wiki/AtticExtension
Ответ 6
Я делаю это с помощью интерактивного стиля ncurses ui hg revert -i
, который позволяет вам обойти и выбрать части, которые вы хотите уничтожить, как файл, так и по-разному, по вашему усмотрению, в зависимости от того, насколько глубоко вы раскрываете свои изменения.
Я не уверен, что это стандартная функция hg
или нет, вы можете проверить ее достаточно легко, если у вас есть ее:
> hg revert --help --verbose | grep -- -interactive
-i --interactive interactively select the changes (EXPERIMENTAL)
Просто помните, что изменения, которые вы отмечаете (X
), будут тем, что будет уничтожено, а не тем, что вы сохраняете.
Ответ 7
Если фиксация, в которой вы хотите внести изменения, например, ba1c841aaff4,
проще всего использовать:
hg meld -r ba1c841aaff4^ <filename>
Теперь нажмите на стрелку вправо (указывая направо) в середине, чтобы вернуть свои строки, сохранить файл и закрыть meld. kdiff3 (старый и неинтуитивный) может быть альтернативой.
Примечание: для использования meld вам необходимо настроить его в нашем файле ~/.hgrc:
[extdiff]
cmd.meld =
[merge-tools]
meld.args=$base $local $other