Системы на основе DAG, такие как Mercurial и Git, представляют собой все или ничего: когда вы объединяете две ветви, вы делаете трехстороннее объединение общего предка и двух ветвей.
Трехстороннее объединение только касается финальной стадии каждой ветви.Например, не имеет значения, внесете ли вы изменения в 10 или 1000 шагов - результат объединения будет таким же.
Это означает, что единственный способ игнорировать набор изменений - это вернуть его дослияние:
$ hg backout BAD
Это отменит набор изменений в ветви, создавая впечатление, что оно никогда не было сделано с точки зрения трехстороннего слияния.
Если у вас есть целая ветвьчто вы хотите объединить, но игнорировать, тогда вы можете сделать фиктивное объединение :
$ hg merge --tool internal:local --non-interactive
$ hg revert --all --rev .
, которое проходит через объединение, но возвращается к старому состоянию перед фиксацией.
Лучший совет, который я могу вам дать, - это структурировать рабочий процесс так, чтобы вышеуказанные отказы не были необходимы.Это означает исправление ошибки в самой старой аппликативной ветке .Если при создании функции X обнаружена ошибка, используйте hg bisect
, чтобы выяснить, когда эта ошибка появилась.Теперь обновите обратно до самой старой ветки, где вы все еще хотите исправить ошибку:
$ hg update 2.0
# fix bug
$ hg commit -m "Fixed issue-123"
, затем объедините исправление со всеми более поздними ветками:
$ hg update 2.1
$ hg merge 2.0
$ hg commit -m "Merge with 2.0 to get bugfix for issue-123"
$ hg update 2.2
$ hg merge 2.1
$ hg commit -m "Merge with 2.1 to get bugfix for issue-123"
Если исправление больше не применяется,тогда вы должны все еще объединить , но выбросить несвязанные изменения:
$ hg update 3.0
$ hg merge 2.2 --tool internal:local --non-interactive
$ hg revert --all --rev .
$ hg commit -m "Dummy merge with 2.2"
Это гарантирует, что вы всегда можете использовать
$ hg log -r "::2.2 - ::3.0"
для просмотра наборов изменений на 2.2ветвь, которая еще не была объединена в 3.0.