Как вы отменяете эффект слияния на поляризованных ветвях, не умирая от агонии?
Эта проблема преследовала меня в течение месяцев, и я, наконец, сдался.
У вас есть 1 репозиторий с 2 Именованными ветвями. A и B.
Изменения, которые происходят с 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 является mercurial, ошибочно повторяя изменение, которое не предназначалось для удаления.
Эта дилемма вызвала много разочарований и синего дыма, и я хотел бы положить этому конец.
Примечание
Может быть очевидным ответом на то, чтобы попытаться запретить обратное слияние, либо с помощью крючков, либо с помощью политик, я обнаружил, что способность обманывать это довольно высоко, и вероятность того, что это произойдет настолько вероятно, что даже с помощью контрмер, вы все равно должны предполагать, что это неизбежно произойдет, чтобы вы могли решить это, когда это произойдет.
Чтобы выполнить
В модели я использовал файлы Seperate. Это делает проблему простой. Они представляют собой произвольные изменения, которые могут быть отдельной строкой.
Кроме того, чтобы добавить оскорбление к травме, на ветке A произошли существенные изменения, которые оставляют постоянную проблему "вносить изменения в ветвь A в конфликт с изменениями в ветке B, которая только что появилась (и получила поддержку), которая выглядит как изменение на ветке А вместо"
Об истории перезаписи трюков:
Проблема со всеми этими ретроактивными решениями такова:
- У нас 9000 коммитов.
- Cloning freshly таким образом занимает полчаса.
- Если существует какой-то один плохой клон репозитория где-то, есть вероятность, что он возвращается в контакт с исходным репозиторием и снова сбивает его с толку.
- Все уже клонировали этот репозиторий, и теперь прошло несколько дней с текущими фиксациями.
- Один такой клоун, оказывается, является живым сайтом, поэтому "вытирая его и начинать с нуля" = "большой нон"
(Я допускаю, что многие из вышеперечисленных немного глупы, но они находятся вне моего контроля).
Единственными жизнеспособными решениями являются те, которые предполагают, что люди могут и будут делать все неправильно, и что существует способ "отменить" эту ошибку.