Как проверить потенциальные конфликты слияния/переадресации в Mercurial?
Есть ли простой способ проверить, приведет ли слияние/переустановка к конфликтам файлов, фактически не выполнив слияние /rebase?
Я хочу решить, следует ли:
- rebase, если затронутый набор файлов (мой против их) различен
- merge, если мы возились с одними и теми же файлами.
Так как плохое слияние (вызванное разрешением конфликтов неправильным путем человеческой ошибкой) легче обнаружить и отменить, если я делаю слияние двух голов, вместо того, чтобы делать rebase. Особенно, если я подталкиваю свои изменения и позже понял, что что-то испортилось.
(Невозможно всегда проверять все заранее, так как у нас нет полностью полного набора тестов.).
И.. Я запускаю Windows.:)
Ответы
Ответ 1
Итак, с некоторой помощью от Martin ответ, я придумал расширение rebaseif, которое делает то, что я хочу.
По существу, он пытается переустановить с помощью инструмента внутреннего слияния, если это не удается (что он делает для любого конфликта), он прерывает и выполняет слияние с предпочтительным инструментом пользователя.
Подробнее см. https://bitbucket.org/marcusl/ml-hgext/src/tip/rebaseif.py.
Обновление
В последние месяцы я вернулся, чтобы просто слить, поскольку он по своей сути безопасен. Неконфликтная перебаза может все еще затуманиваться, поскольку зависимые файлы могут повлиять на изменение. (т.е. rebase теряет информацию о том, как выглядел код перед слиянием).
Как автор rebaseif, я рекомендую вместо этого использовать обычное старое слияние.:)
Ответ 2
Нет причин использовать hg merge
, если изменения перекрываются и hg rebase
иначе, так как hg rebase
делает слияние внутри и разрешает его разрешать с использованием тех же инструментов, что и hg merge
.
Что касается тестирования, если слияние или переадресация вызовет конфликты, вы можете использовать
$ hg merge --tool internal:merge
в Mercurial 1.7, чтобы переопределить вашу обычную конфигурацию слияния. (Часть --tool internal:merge
является новой, используйте --config ui.merge=internal:merge
в более ранних версиях Mercurial.)
После слияния
$ hg resolve --list
сообщит вам результаты, и вы вернетесь туда, где вы начали с
$ hg update --clean .
Ответ 3
Вы можете увидеть, что два набора изменений REV1 и REV2 влияют на любой из тех же файлов, что-то вроде:
(hg status --change REV1 --no-status ; hg status --change REV2 --no-status) | sort | uniq --repeated
Если у него есть какой-либо вывод, то тот же файл затрагивается в обеих версиях.
Это можно легко сделать оболочкой script как:
#!/bin/sh
(hg status --change $1 --no-status ; hg status --change $2 --no-status) | sort | uniq --repeated
который можно запустить как любой из следующих:
./find_overlaps c8f7e56536ab d9e2268e20b9
./find_overlaps 1 33
Если вы действительно хотели получить фантазию, вы можете настроить script для автоматического запуска слияния или переадресации в зависимости от того, были ли найдены какие-либо строки.
Если ты на окнах, мой бог тебе поможет.:)