В Mercurial как извлечь изменения одного файла из набора изменений, чтобы применить их к другой ветви?


У меня есть большая фиксация многих файлов в одной ветви, мне нужно перенести изменения одного файла в этом наборе изменений в другую ветвь. Как я могу это сделать? Я в основном использую TortoiseHg, но решения командной строки также хороши.

Если я перейду к набору изменений в TortoiseHg и выберу файл, я смогу увидеть различия, которые я хочу передать, но не способ их реального применения.

2 6

2 ответа:

Вы можете получить патч только для этого файла, используя:

hg log -r THEREVISIONWITHLOTSOFCHANGES -p -I path/to/justthatfile > justthatfile.patch

Которые затем можно импортировать в любую ветвь, сделав следующее:

hg update anotherbranch
hg import --no-commit justthatfile.patch
hg commit

Самое простое решение-сбросить патч файла, применить его к текущей рабочей ревизии и зафиксировать его (предполагая, что вы находитесь в корне репозитория):

$ hg up <revision-to-apply-the-patch-to>
$ hg diff -c <revision-containing-the-patch> <files-to-include> | patch -p0
$ hg ci -m "Transplanting selected changes from <revision-contain...>"
Недостатком этого метода является то, что не очень очевидно, что вы сделали с точки зрения истории изменений. Здесь помогает хорошее сообщение о фиксации, но график истории не дает никакого намека на процесс переноса некоторых изменений. В этом случае слияние и возврат могут быть лучше решение:
$ hg up <revision-to-apply-the-patch-to>
$ hg merge -r <revision-containing-the-patch>
$ hg revert --no-backup <files-to-exclude>
$ hg ci -m "Merge in changes of <files-to-include>"
Вероятно, есть и другие решения для этого - эти два пришли мне в голову первыми.