Mercurial линейная история с использованием hb rebase с незафиксированными изменениями - PullRequest
3 голосов
/ 14 октября 2011

Предположим, у меня есть несколько коммитов в локальном репо и некоторые незафиксированные изменения в рабочем каталоге.После hg pull, hg update я получаю пару новых наборов изменений из центрального репо, которые создают нового руководителя в локальном репо.

Теперь предположим, что я не хочу объединять эти две головы и нажимать, и в этом случае я получу сообщение о том, что у меня есть незафиксированные изменения в рабочем каталоге при попытке слияния.

Также предположим, что я не хочу использовать hg shelve для хранения незафиксированных изменений и объединения без проблем, но хотел бы создать линейную историю с помощью hg rebase, поэтому я помещаю свои коммитыповерх вытащенных коммитов.Когда я делаю ребазинг, фактически я делаю слияние, как показано здесь , в главе hg rebase.

Теперь у меня вопрос: получу ли я то же сообщение об ошибке: «не удается выполнить слияние, есть незафиксированные изменения», поскольку hg rebase подразумевает неявное слияние или нет?

Если да, то мне придется использовать hg shelve в обоих случаях: явное слияние двух головок и неявное слияние при перебазировании, нет?

Заранее спасибо,
Приветствия

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Простой ответ - да.hg rebase не позволит вам выполнить ребаз, если у вас есть незафиксированные изменения.Есть несколько решений, ни одно из которых не является идеальным:

  • Зафиксируйте свою выдающуюся работу, сделайте ребаз, затем hg export tip > foo.patch, hg strip tip и hg import --no-commit foo.patch.

  • Использовать hg shelve.Я не могу комментировать это подробно, так как я не пробовал.

  • Создайте новую именованную ветвь с hg branch <branch-name> и зафиксируйте вашу выдающуюся работу в именованной ветке.Затем вы можете использовать hg rebase --keepbranches --base <branch-name> --dest default, чтобы перебазировать вашу рабочую ветку поверх новых изменений.Лично я нахожу, что работа с именованными ветками (которые никогда не уходят из моего клона в апстрим) является очень хорошим способом управления такого рода рабочим процессом, поскольку он позволяет легко перемещаться назад и вперед между апстримом и моим текущим проектом [s], иштраф за коммит на ветке не взимается.

4 голосов
/ 14 октября 2011

Предположим, у меня есть несколько коммитов в локальном репо и некоторые незафиксированные изменения в рабочем каталоге. После hg pull, hg update я получаю несколько новых наборов изменений из центрального репо, которые создают новый руководитель в локальном репо.

Если у вас есть незафиксированные изменения в рабочем каталоге, и hg pull даст вам новый заголовок из апстрима, hg update скажет вам:

abort: crosses branches (merge branches or use --clean to discard changes)

Если вы попытаетесь объединиться, вы получите сообщение о невозможности объединения с незафиксированными изменениями.

Все это по очень веской причине: если изменения не зафиксированы, они могут быть потеряны навсегда, когда включится механизм слияния. Вы должны либо зафиксировать, либо отложить свои незафиксированные изменения, прежде чем пытаться слиться с или перебазировать на восходящий код.

Вы также можете использовать MQ, чтобы помочь вам в этом; MQ и rebase разработаны так, чтобы хорошо играть вместе, поэтому, если ваши локальные не полностью законченные изменения управляются MQ, вам нужно всего лишь hg qrefresh; hg pull --rebase.

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