mercurial - увидеть изменения в ветке, игнорируя все коммиты слияния
У меня есть ветка, которая была разработана в течение длительного периода времени. Во время разработки ветка по умолчанию была объединена с этой веткой несколько раз. Теперь я хотел бы рассмотреть все изменения, внесенные в эту ветку, игнорируя слияния, чтобы решить, безопасно ли слить ее с настройками по умолчанию.
Я старался
hg diff -r "branch('myBranch') - merge()"
но он все еще показывает изменения, внесенные слиянием. Также попытался следовать этому Как показать различия, специфичные для именованной ветви в Mercurial, но
hg diff -r "branch('myBranch') - branch('default')"
по-прежнему вносить изменения, внесенные путем слияния.
4 ответа
Проблема с вашими командами в том, что когда вы выполняете hg diff
и передайте ему несколько наборов изменений, вы фактически выполните различие между этими наборами изменений, следовательно, вы увидите результат слияния.
Если вы хотите увидеть только изменения, сделанные с помощью наборов изменений, то вы можете использовать export
:
$ hg export -r "branch('mybranch') and not merge()"
// lists the changes made by each changeset
Для удобства просмотра вы можете вывести их в файлы с именами на основе идентификатора ревизии / набора изменений:
$ hg export -r "branch('mybranch') and not merge()" -o "%H.patch"
... создает файл для каждого набора изменений без слияния в mybranch
и выводит его в файл с именем "40-значный changeset id.patch". Если вы предпочитаете номер ревизии (полезно только для вашего локального репозитория, так как идентификаторы ревизий являются локальными), используйте "%R.patch"
,
Следующее использует log
команда, но с --patch
Параметр также может отображать измененные строки:
hg log --branch my-branch --no-merges --patch
Краткая форма:
hg log -Mpb my-branch
Пытаться:
hg diff -r"ancestor(default,my_branch)" -rmy_branch
Если вы не сделали никаких слияний с ветвью, то "предок" подберет исходную точку ветвления. Если вы сделали слияния, то "предок" выберет последнюю точку слияния.
Например, на графике ниже вы получите разницу между 520 и 519:
@ 521 (default)
|
| o 520 (my_branch)
|/|
o | 519
| |
o | 518
| |
o | 517
| |
| o 516
| |
| o 515
| |
| o 514
|/
o 513
На более простом графике ниже вы получите разницу между 516 и 513:
@ 517 (default)
|
| o 516 (my_branch)
| |
| o 515
| |
| o 514
|/
o 513
Это очень хороший вопрос, на который я долго пытаюсь найти хороший ответ, но пока не нашел хорошего. Хорошо, одна вещь, которая работает на 100%, это:
hg status # make sure that you don't have local changes
hg up <target_branch>
hg merge <your branch>
hg diff > merge.diff
hg up -C # this one cleans the merge
Я использую этот рабочий процесс все время, но он не удовлетворяет меня полностью, потому что он требует переключения ветвей (когда я на самом деле, возможно, не хочу делать фактическое слияние прямо в этот конкретный момент, я просто проверяю, что там)
Я целую вечность искал здесь хорошее решение, но пока ничего не найдено. Пробовал те:
hg diff -r "branch('.') and ! merge()" # this page
hg diff -r "default:branch('.') and not merge()"
hg diff -r "parents(branch(.)):branch('.') and not merge()"
Эта проблема также обсуждается в:
- Mercurial: как я могу увидеть только изменения, внесенные слиянием? который имеет хороший ответ как: "так что если вы можете определить это однозначно, вы можете убедить одного из нас, разработчиков Mercurial, которые читают SO для его реализации".
Пер Мэтт Макколл, вероятно, вам нужно:
hg diff -r mainbranchrev -r mywork
Он пишет:
У вас может сложиться впечатление, что "набор изменений - это дельта" или что-то подобное, и что это означает, что Mercurial может волшебным образом связать вместе кучу несмежных дельт, чтобы построить большую дельту, которая является просто вашими изменениями.
На самом деле Mercurial намного проще. Набор изменений на самом деле представляет собой снимок: полный набор полных файлов, представляющих состояние проекта на момент фиксации. А разница - это просто разница между этими двумя снимками. Итак, когда вы это сделаете:
hg stat --rev '3408::3575 и пользователь (mdiamond), а не merge()'
..status просто использует первую и последнюю ревизию результирующего набора для вычисления.
Когда вы выполняете инкрементные слияния в своей ветке разработки, вы неразрывно связываете свою работу с основной разработкой, и Mercurial не настолько умен, чтобы распутать это так, как вы просите. Лучше всего сравнить руководителя вашей работы с руководителем основной ветви:
hg diff -r mainbranchrev -r моя работа
..который покажет всю вашу работу плюс все исправления слияния, которые вам нужно было сделать.