Как вы можете обратить вспять эффект слияния на поляризованные ветви, не умирая от агонии?
Эта проблема мучила меня в течение месяцев , и я наконец сдался.
У вас есть 1 репозиторий с 2 именованными филиалами. А и Б.
Изменения, которые происходят с A, неизбежно произойдут на B.
Изменения, которые происходят непосредственно на B, НЕ ДОЛЖНЫ происходить на A.
В такой конфигурации слияние «B» с «A» создает ужасную проблему в хранилище, так как все изменения в B появляются в A, как если бы они были сделаны в A.
Единственный "нормальный" способ выхода из этой ситуации - это "откат" слияния, то есть:
hg up -r A
hg backout -r BadMergeRev --parent BadMergerevBeforeOnA
Который выглядит все отлично и модно, пока вы не решите объединиться позже в правильном направлении, и вы в конечном итоге столкнетесь со всевозможными неприятными вещами, и код, который был стерт / закомментирован специально для ветви B, внезапно станет нерасчлененным или незакомментированным.
До сих пор не было работоспособного решения этой проблемы, кроме как «пусть он сделает свое дело, а потом решит все проблемы вручную», и, честно говоря, это немного глупо.
Вот изображение, проясняющее проблему:
[Исходное изображение потеряно]
Файлы C & E (или изменения C & E) должны появляться только в ветви b, а не в ветви a.
Ревизия A9 здесь (ветка a, revno 9) является началом проблемы.
Версии A10 и A11 являются фазами «Объединение возврата» и «Объединение возврата».
И ревизия B12 является ртутной, ошибочно неоднократно отбрасывая изменения, которые должны были быть исключены.
Эта Дилемма вызвала большое разочарование и синий дым, и я хотел бы положить этому конец.
Примечание
Может быть, очевидным ответом будет попытка запретить обратное слияние, либо с помощью хуков, либо с помощью политик. Я обнаружил, что возможность исправить это довольно высока, и вероятность того, что это произойдет настолько вероятно, что даже при контрмерах, Вы должны по-прежнему предполагать, что это неизбежно, произойдет , и вы сможете решить его, когда это произойдет.
Для разработки
В модели я использовал отдельные файлы. Это заставляет проблему звучать просто. Они просто представляют произвольных изменений , которые могут быть отдельной строкой.
Кроме того, чтобы добавить оскорбление к травме, произошли существенные изменения в ветви A, которая оставляет постоянную проблему: «сделать изменения в ветви A конфликтующими с изменениями в ветви B, которая только что появилась (и получила отказ), которая выглядит как изменение на ветке А вместо "
О переписывании истории:
Проблема со всеми этими ретроактивными решениями заключается в следующем:
- У нас 9000 коммитов.
- Свежее клонирование, таким образом, занимает полчаса
- Если существует хотя бы один плохой клон репозитория где-то , существует вероятность того, что он снова соприкоснется с исходным хранилищем и снова ударит по нему.
- Все уже клонировали этот репозиторий, и теперь прошло несколько дней с текущими коммитами.
- Один из таких клонов - это живой сайт, так что "стереть его и начать с нуля" = "big nono"
(Признаюсь, многие из вышеперечисленных немного глупы, но они находятся вне моего контроля).
Единственные жизнеспособные решения - это те, которые предполагают, что люди могут и будут делать все неправильно, и что есть способ «исправить» эту ошибку.