В Git я могу сделать это:
1. Начните работать над новой функцией: $ git co -b newfeature-123 # (локальная ветка разработки функций) сделать несколько коммитов (M, N, O) мастер A --- B --- C \ newfeature-123 M --- N --- O 2. Вытащите новые изменения из основной ветки разработки: $ git pull (мастер обновлен с помощью ff-коммитов) мастер A --- B --- C --- D --- E --- F \ newfeature-123 M --- N --- O 3. Перебазировать мастер, чтобы моя новая функция могут быть разработаны с учетом последних изменений в основной ветке разработки: (из newfeature-123) $ git rebase master мастер A --- B --- C --- D --- E --- F \ newfeature-123 M --- N --- O
Я хочу знать, как сделать то же самое в Mercurial, и я искал в Интернете ответ, но лучшее, что я смог найти, было: git rebase - могу ли это сделать hg
Эта ссылка содержит 2 примера:
1. Я признаю, что это: (замена ревизий из примера ревизиями из моего собственного примера)
hg up -CF hg branch -f newfeature-123 трансплантация ртути -a -b newfeature-123
это не так уж и плохо, за исключением того, что он оставляет MNO с предварительной перебазой в виде неразбавленной головы и создает 3 новых коммита M ', N', O ', которые представляют их ответвления от обновленной магистрали.
В основном проблема в том, что я в конечном итоге с этим:
мастер 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 до F hg ветка newfeature-123 hg qpush -a hg qdel -r qbase: qtip
и это приводит к желаемому графику:
мастер A --- B --- C --- D --- E --- F \ newfeature-123 M --- N --- O
но эти команды (все 6 из них!) кажутся намного более сложными, чем
$ git rebase master
Я хочу знать, является ли это единственным эквивалентом в Hg или есть какой-то другой доступный способ, такой как Git.
git reflog
и они не исчезнут полностью, пока не соберет мусор. Если вы хотите хранить их в именованной ветке, чтобы вам не приходилось использовать reflog, просто сделайте этоgit branch feature-123_original
перед ребазингом.Ответы:
У VonC есть ответ, который вы ищете , расширение Rebase. Однако стоит потратить секунду или две на размышления о том, почему ни mq, ни rebase не включены по умолчанию в mercurial: потому что mercurial - это все о несмываемых наборах изменений. Когда я работаю так, как вы описываете, и это почти ежедневно, вот шаблон, который я выбираю:
и это действительно все, что нужно. Я получаю клон newfeature-123, который я могу легко перенести на основную линию, когда я доволен этим. Но самое главное, я никогда не менял историю . Кто-то может посмотреть на мои csets и увидеть, против чего они были изначально закодированы и как я реагировал на изменения в основной линии на протяжении всей моей работы. Не все думают, что это имеет значение, но я твердо убежден, что задача контроля источников - показать нам не то, что мы хотели, а то, что произошло на самом деле - каждый затухающий и каждый рефакторинг должен оставить неизгладимый след и опровергнуть и другие методы редактирования истории скрывают это.
Теперь иди и найди ответ VonC, пока я убираю свою мыльницу. :)
источник
Возможно, вы ищете Rebase Extension . (реализовано в рамках SummerOfCode 2008 )
Получение от :
чтобы:
Как прокомментировал ниже по steprobe :
(
--keepbranches
: Унаследовать оригинальное имя ветви.)Мойка упоминает:
Как показано ниже на Jonathan Blackburn :
источник
hg up newfeature-123
за нимhg rebase -d master --keepbranches
hg rebase --source {L1's-sha} --dest {R2's-sha}
, но я не знал, что смогу добавить--keepbranches
в конце. Это упоминается в других ответах с более низким рейтингом, но было бы неплохо также написать это в ответ.Предполагая, что у вас установлена современная Hg, вы можете просто добавить:
до ~ / .hgrc.
Тогда вы можете использовать команды
hg rebase
,hg pull --rebase
илиhg help rebase
.источник
hg rebase -s o -d f
Я не думаю, что ответы выше достигают цели OP, которая состояла в том, чтобы поддерживать его ветвь задач, просто перебазировались в более позднюю точку родительской ветки.
Допустим, я начинаю с этого графа (созданного с использованием расширения graphlog. Серьезная любовь к графу).
Если я нахожусь в ветке feature3 и хочу перебазировать ее из коммита снова, я понимаю, что я бы запустил
hg rebase -d default
. Это имеет следующий результат:Миссия выполнена? Я так не думаю. Проблема в том, что когда коммиты на ветке feature3 были перебазированы снова снова, ветка feature3 была удалена . Мои коммиты были перемещены в ветку по умолчанию, чего я и пытался избежать в первую очередь.
В Git результат будет выглядеть так:
Обратите внимание, что ветвь feature3 все еще существует, эти два коммита все еще находятся в ветке feature3 и по умолчанию не видны. Без сохранения ветви задачи я не вижу, как это функционально отличается от слияния.
ОБНОВЛЕНИЕ : я обнаружил
--keepbranches
флаг, поддерживаемый hg rebase, и я рад сообщить, что все в порядке. С помощьюhg rebase -d default --keepbranches
, я точно повторяю поведение Git, которое я жаждал. Пару псевдонимов позже, и я перебираю, как никто другой.источник
Поскольку некоторые люди говорят, что, по их мнению, хорошо сохранять каждую итерацию всего, я укажу, что для более крупных проектов с открытым исходным кодом принятие изменений, полных слияний и итераций разработки, создаст беспорядочную историю изменений основной линии и сделает история ревизий менее полезна, чтобы увидеть, как текущая версия попала туда.
Это хорошо работает, когда отправленные изменения проверяются людьми, которые их не написали, прежде чем они будут приняты, поэтому изменения, которые попадают в основную ветку, обычно отлаживаются и работают. Затем, когда вы возвращаетесь к началу линии, вы видите все изменения, которые происходят с ней, а не какой-то момент в середине развития изменения, частью которого она является.
На странице участников x265 объясняется, как повторно зафиксировать набор изменений, над которыми вы работаете, чтобы подготовить их к отправке. к отправке в проект x265. (Включая использование TortoiseHG для фиксации некоторых, но не всех изменений в отдельном файле, например, сценарий / нестандартный блок diff для коммита в git gui).
Процесс состоит в том, чтобы обновить hg до вышестоящей подсказки, а затем отменить все ваши изменения в рабочем каталоге. Отложите все, что не является частью того, что вы хотите отправить, затем разбейте остальное на столько подходящих отдельных коммитов, с хорошими сообщениями коммитов.
Я предполагаю, что вы скопируете / вставите, а затем отредактируете сообщения коммита из предыдущих итераций набора исправлений, который вы редактируете. Или, может быть, вы могли бы привить свои старые коммиты (cherry-pick на git language), а затем изменить их один за другим, чтобы ваши старые сообщения коммитов стали отправной точкой для редактирования.
источник