В Мерзавце я могу сделать это:
1. Start working on new feature: $ git co -b newfeature-123 # (a local feature development branch) do a few commits (M, N, O) master A---B---C \ newfeature-123 M---N---O 2. Pull new changes from upstream master: $ git pull (master updated with ff-commits) master A---B---C---D---E---F \ newfeature-123 M---N---O 3. Rebase off master so that my new feature can be developed against the latest upstream changes: (from newfeature-123) $ git rebase master master A---B---C---D---E---F \ newfeature-123 M---N---O
Я хочу знать, как выполнить в Подвижном том же самом, и я обыскивал сеть для ответа, но лучшее, которое я мог найти, было: перебаза мерзавцев - может hg делать это
Та ссылка обеспечивает 2 примера:
1. Я признаю что это: (замена изменений от примера с изменениями от моего собственного примера),
hg up -C F hg branch -f newfeature-123 hg transplant -a -b newfeature-123
не слишком плохо, за исключением того, что это оставляет позади предпереоснову M-N-O как необъединенная голова и создает 3 новых фиксации M', N', O', которые представляют их отклоняющийся обновленная магистраль.
В основном проблема состоит в том, что я заканчиваю с этим:
master A---B---C---D---E---F \ \ newfeature-123 \ M'---N'---O' \ newfeature-123 M---N---O
это не хорошо, потому что это оставляет позади локальные, нежелательные фиксации, которые должны быть отброшены.
hg qimport -r M:O hg qpop -a hg up F hg branch newfeature-123 hg qpush -a hg qdel -r qbase:qtip
и это действительно приводит к желаемому графику:
master A---B---C---D---E---F \ newfeature-123 M---N---O
но эти команды (все 6 из них!) кажусь настолько более сложным, чем
$ git rebase master
Я хочу знать, является ли это единственным эквивалентом в Hg или если существует некоторый другой путь, доступный, который прост как Мерзавец.
У VonC есть ответ, который вы ищете , - расширение Rebase. Однако стоит потратить секунду или две на размышления о том, почему ни mq, ни rebase не включены по умолчанию в mercurial: потому что mercurial - это все о нестираемых наборах изменений. Когда я работаю так, как вы описываете, а это почти ежедневно, я беру вот такую схему:
1. Start working on a new feature:
$ hg clone mainline-repo newfeature-123
do a few commits (M, N, O)
master A---B---C
\
newfeature-123 M---N---O
2. Pull new changes from upstream mainline:
$ hg pull
master A---B---C---D---E---F
\
newfeature-123 M---N---O
3. merge master into my clone so that my new feature
can be developed against the latest upstream changes:
(from newfeature-123)
$ hg merge F
master A---B---C---D---E---F
\ \
newfeature-123 M---N---O---P
, и это действительно все, что необходимо. В итоге я получаю клон newfeature-123, который я могу легко вернуть в основную ветку, когда мне это нравится. Но самое главное, что я никогда не менял историю .Кто-то может взглянуть на мои csets и увидеть, против чего они изначально были написаны, и как я реагировал на изменения в основной ветке на протяжении всей моей работы. Не все думают, что это имеет ценность, но я твердо убежден, что работа системы управления версиями - показать нам не то, что мы хотели, а то, что произошло на самом деле - каждый тупик и каждый рефакторинг должен оставлять неизгладимый след, и перебазирование и другие методы редактирования истории скрывают это.
А теперь иди и выбери ответ VonC, пока я убираю свою мыльницу. :)
Возможно, вы ищете расширение Rebase . (реализовано как часть SummerOfCode 2008 )
В этих случаях может быть полезно «отсоединить» локальные изменения, синхронизировать репозиторий с основным потоком, а затем добавить частные изменения поверх новых удаленные изменения. Эта операция называется перебазированием.
до:
Как прокомментировал ниже steprobe :
В случае, если вы не вводите изменения в , и у вас есть две ветки в вашем репо, вы можете сделать ( используя
keepbranches
):
hg up newfeature-123
hg rebase -d master --keepbranches
( - keepbranches
: унаследовать исходное имя ветки.)
Мойка упоминает:
Мне нравится использовать
hg rebase --source {L1's-sha} --dest {R2's-sha}
, но я не знал, что могу добавить] - ответвления
в конце.
Как проиллюстрировано ниже Джонатаном Блэкберном :
hg rebase -d default --keepbranches
Предполагая, что у вас установлена современная Hg, вы можете просто добавить:
[extensions]
rebase =
в ~ / .hgrc.
Затем вы можете использовать команды hg rebase
, hg pull --rebase
или hg help rebase
.