Из того, что я понял по вашему вопросу, вы чувствуете, что хотите иметь то же состояние удаленного хранилища, что и состояние вашего локального хранилища.Также у вас нет дополнительной ветки, вам нужна линейная история, а также один коммит.
Давайте сначала рассмотрим две вещи, 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.
Ссылки по теме