Hg: Как сделать переоснову как перебаза мерзавца

В Мерзавце я могу сделать это:

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

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

  1. Другая опция из той же ссылки
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 или если существует некоторый другой путь, доступный, который прост как Мерзавец.

207
задан Vadim Kotov 29 June 2017 в 01:52
поделиться

3 ответа

У 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, пока я убираю свою мыльницу. :)

234
ответ дан 23 November 2019 в 04:44
поделиться

Возможно, вы ищете расширение Rebase . (реализовано как часть SummerOfCode 2008 )

В этих случаях может быть полезно «отсоединить» локальные изменения, синхронизировать репозиторий с основным потоком, а затем добавить частные изменения поверх новых удаленные изменения. Эта операция называется перебазированием.

Получение от :

alt text

до:

alt text


Как прокомментировал ниже 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
103
ответ дан 23 November 2019 в 04:44
поделиться

Предполагая, что у вас установлена ​​современная Hg, вы можете просто добавить:

[extensions]
rebase = 

в ~ / .hgrc.

Затем вы можете использовать команды hg rebase , hg pull --rebase или hg help rebase .

44
ответ дан 23 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: