Как объединить, чтобы избавиться от головы с командной строкой Mercurial, как я могу сделать с TortoiseHg? - PullRequest
34 голосов
/ 16 ноября 2010

У меня такой вопрос:

  • Если в моем хранилище Mercurial есть две головы (ветви с изменениями), и я хотел бы избавиться от одной из них, но отменить все измененияиз этой ветви вместо объединения их в другую, и я не могу удалить эти наборы изменений, поэтому мне нужно объединить, как я могу это сделать с помощью клиента командной строки?

ЕслиУ меня есть две головы в моем хранилище 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's 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

Здесь внесены изменения в2-я ревизия (та, которая имеет номер ревизии 1) теперь присутствует в объединенной ревизии.Это не то, что я хотел.

Ответы [ 2 ]

31 голосов
/ 16 ноября 2010

Согласно источнику TortoiseHG, когда вы проверяете 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 ..."
3 голосов
/ 04 мая 2015

Если вы не хотите использовать 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

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

...