Mercurial: отправка набора изменений без его предка - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть ветка «По умолчанию», которая поступает из другого хранилища.
У меня есть работа в ветке "Mytask".

Когда я закончил свою работу, я извлекаю из удаленного репозитория ревизию 7. Я слил из своих локальных ревизий 6 с 7 и зафиксировал в8.

           Rev  Branch

    *      8    Default
    |\ 
    * \    7    Default
    |  |
    |  *   6    Mytask
    |  | 
    |  *   5    Mytask
    |  |
    *  |   4    Default
    |  |
    * /    3    Default
    |/
    *      2    Default
    |
    *      1    Default

Кто-нибудь знает, можно ли перенести версию 8 в удаленный репозиторий, не нажимая также на мою ветку Mytask с наборами изменений 5 и 6?

Любые отзывы приветствуются!

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Посмотрите на ответы на этот вопрос о совершении раздавливания .Сквош является ключевым словом в этом случае.

Существует расширение свертки , которое похоже на то, что вы хотите сделать, а также другие ссылки на этот вопрос.

0 голосов
/ 29 октября 2016

Из того, что я понял по вашему вопросу, вы чувствуете, что хотите иметь то же состояние удаленного хранилища, что и состояние вашего локального хранилища.Также у вас нет дополнительной ветки, вам нужна линейная история, а также один коммит.

Давайте сначала рассмотрим две вещи, merge и rebase.

Первоначальновы клонировали стабильную версию, вы зафиксировали свои собственные наборы изменений, которые x и y, вы извлекли наборы изменений из удаленного репозитория, которые a, b и c.Теперь ваша история выглядит примерно так:

stable -> a -> b -> c
        \
         \-> x -> y

Слияние

Вы хотите, чтобы ваш репозиторий находился в таком состоянии, как если бы вы хотели иметь одну голову.Вы выбрали слияние.Вы сделали hg up -r b и hg merge -r y, разрешили конфликты слияния, если бы они там были.Теперь ваша история выглядит следующим образом.

 stable -> a -> b -> c -> d
        \             /
         \-> x -> y -/

Теперь у вас есть новый коммит d, который является коммитом слияния.Текущее состояние вашего репо после обновления до d содержит изменения из обеих родительских веток.

Rebase

Rebase - это расширение в Mercurial, которое вы можете легко использоватьдобавив строку в ваш .hgrc.Давайте посмотрим, что происходит, когда вы делаете hg rebase -s x -d c в начальном состоянии, которое у нас было.Ваша история выглядит следующим образом.

stable -> a -> b -> c -> x -> y

В этом случае у вас есть линейная история, и оба набора изменений x и y находятся в стабильной ветви.

Заключение

Сильная причина, по которой люди склонны использовать rebase из merge, чтобы они могли поддерживать линейную историю, что очень помогает в обмене изменениями с другими репозиториями.

В вашем случае вы можете отменить коммит слияния либо hg rollback, либо hg strip, если у этого коммита слияния нет дочерних элементов.В случае детей вы должны rebase их на y, затем strip коммит слияния, затем rebase всю цепочку от x до c.

Из DAGв разделе ребаз (выше) вы можете легко нажать x и y.Если вы хотите вместо одного коммита, вы можете использовать histedit extension или fold команду, которая является частью evolve, обе из которых могут свернуть / объединить / объединить / сквош / сложить эти два коммита в один коммититоговая история будет выглядеть следующим образом.

stable -> a -> b -> c -> z

Где z содержит изменения как x, так и y changesets.

Ссылки по теме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...