Подтвердить что ты не робот

Как слиться, чтобы избавиться от головы с командной строкой 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 >

4b9b3361

Ответ 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

Документация здесь немного вводит в заблуждение; это только закрывает конкретную голову, а не всю ветвь.