Как слиться, чтобы избавиться от головы с командной строкой Mercurial, как я могу сделать с TortoiseHg?
Мой вопрос:
- Если в моем репозитории Mercurial есть две головы (ветки с изменениями), и я хотел бы избавиться от одного из них, но отбросить все изменения из этой ветки вместо их слияния в другую, и я могу 't вычеркнуть эти изменения, поэтому мне нужно объединить, как я могу сделать это с клиентом командной строки?
Если у меня две главы в моем репозитории Mercurial и я использую TortoiseHg в качестве моего клиента, репозиторий может выглядеть так:
![two heads]()
Затем я могу избавиться от головы test2
, выполнив слияние и отбрасывание. Сначала я бы обновил до головы, которую хотел бы сохранить (test3
в этом случае, который на изображении выше уже является текущим родителем моей рабочей папки). Затем я щелкнул правой кнопкой мыши и выберите "Слить с...":
![merge with...]()
и в появившемся диалоговом окне я бы выбрал отказ от изменений из цели слияния (т.е. ветку, от которой я хочу отказаться от всех изменений):
![merge dialog]()
После этого слияния все изменения в голове test2
были отброшены, и я могу совершить. Теперь голова исчезла, но набор изменений по-прежнему остается частью истории.
Мой вопрос таков: как я могу сделать то же самое, используя только клиент командной строки? Я не могу найти подходящие опции для команды hg merge
:
hg merge [-P] [-f] [[-r] REV]
merge working directory with another revision
... snipped text
options:
-f --force force a merge with outstanding changes
-t --tool VALUE specify merge tool
-r --rev REV revision to merge
-P --preview review revisions to merge (no merge is performed)
--mq operate on patch repository
use "hg -v help merge" to show global options
Редактировать: debugsetparents работал красиво:
hg debugsetparents . 1
hg commit -m "merged to get rid of changeset #1"
Изменить. Попытайтесь использовать --tool internal:local
в соответствии с одним из ответов:
@echo off
setlocal
if exist repo rd /s /q repo
hg init repo
cd repo
rem revision 0
echo >test1.txt
hg commit -m "test1" --addremove
rem revision 1
echo >test2.txt
hg commit -m "test2" --addremove
rem revision 2
hg update 0
echo >test3.txt
hg commit -m "test3" --addremove
rem now let get rid of change in revision 1 with merge
hg merge --tool internal:local -r 1
hg commit -m "merged"
dir
вывод выполнения:
[C:\Temp] :test
adding test1.txt
adding test2.txt
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
adding test3.txt
created new head
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
Volume in drive C is unlabeled Serial number is 0e17:6aba
Directory of C:\Temp\repo\*
16.11.2010 20:05 .
16.11.2010 20:05 ..
16.11.2010 20:05 .hg
16.11.2010 20:05 13 test1.txt
16.11.2010 20:05 13 test2.txt
16.11.2010 20:05 13 test3.txt
39 bytes in 3 files and 3 dirs 12 288 bytes allocated
66 600 316 928 bytes free
Здесь изменения, внесенные во второй набор изменений (тот, который имеет номер версии 1), теперь присутствуют в объединенном наборе изменений. Этого я не хотел.
Забастовкa >
Ответы
Ответ 1
В соответствии с TortoiseHG source, когда вы проверяете Discard all changes from merge target (other) revision
, он использует команду hg debugsetparents
:
hg debugsetparents REV1 [REV2]
manually set the parents of the current working directory
This is useful for writing repository conversion tools, but should be used with care.
Returns 0 on success.
use "hg -v help debugsetparents" to show global options
Для использования:
hg up <revision-to-keep>
hg debugsetparents <revision-to-keep> <revision-to-throw-away>
hg commit -m "Merge to discard ..."
Ответ 2
Обновите рабочий каталог до версии, которую вы хотите сохранить, а затем:
hg merge --tool internal:local -r REVISION_TO_DISCARD
Смотрите Mercurial советы и рекомендации для немного устаревшей информации: --config ui.merge
теперь предоставляется --tool
вариант hg merge
(он был введен в версии 1.7)
Ответ 3
Если вы не хотите использовать debugsetparents
, вы можете вручную вернуться к набору изменений, который хотите сохранить до совершения:
hg merge --tool internal:local -r HEAD_YOU_WANT_TO_DISCARD
hg revert -r 'tip^'
hg commit
Обратите внимание, однако, что этот метод не всегда является лучшим подходом. Вам может быть лучше просто закрыть голову:
hg up HEAD_YOU_WANT_TO_DISCARD
hg commit --close-branch
Документация здесь немного вводит в заблуждение; это только закрывает конкретную голову, а не всю ветвь.