Подтвердить что ты не робот

Mercurial: объединение одного файла между ветвями в одном репо

Когда у меня есть две ветки в реестре Hg, как объединить только один файл с другой ветвью, не имея слияния всех других файлов из набора изменений?

Можно ли объединить только определенные файлы вместо целого набора изменений?

4b9b3361

Ответ 1

ПРЕДУПРЕЖДЕНИЕ: такое "фиктивное слияние", как рекомендуется @Martin_Geisler, может действительно повредить вам, если позже вы захотите сделать истинное слияние двух ветвей. Будет записано фиктивное слияние и скажем, что вы слились в ветку, к которой вы присоединились, - вы не увидите изменений. Или, если вы слились в другую ветку, изменения в этой другой ветке будут отменены.

Если вы хотите только скопировать весь файл из одной ветки в другую, вы можете просто сделать:

   hg update -r to-branch
   hg revert -r from-branch file
   hg ci -m 'copied single file from from-branch to to-branch

Если вы хотите выбрать разные части этого файла, то полезно использовать "hg record".

Я просто сделал это в своем домашнем каталоге .hgignore.

Если обе ветки внесли изменения в файл, который вы хотите сохранить, грязным трюком было бы создание слияния двух ветвей с использованием hg merge, возможно/возможно, на еще одной ветке, проверьте это, а затем скопируйте один файл между слиянием и ветвью:

   hg update -r to-branch
   branch merge-branch
   hg merge -r from-branch
   hg ci -m 'temp merge to be discarded"
   hg update -r to-branch
   hg revert -r merge-branch single-file
   hg ci -m 'merged single-file from from-branch to to-branch"
   hg strip merge-branch

Стоит упомянуть: способ "скопировать один файл между ветвями" (или ревизии, или из версии для слияния, или....) - это "hg revert". То есть.

   hg update -r Where-you-want-to-copy-to
   hg revert -r Where-you-want-to-copy-from file-you-want-to-copy
   ...
   hg ci

По какой-то причине я и некоторые из моих коллег находят это ОЧЕНЬ запутанным. "revert" == "copy"... имеет смысл для некоторых шаблонов использования, но не для всех.

Ответ 2

Неа. Mercurial работает на основе набора изменений.

Но вы можете сделать " фиктивное слияние", где вы игнорируете входящие изменения из одной из ветвей. Перед фиксацией вы можете вернуть выбранные файлы в любое состояние, которое вы хотите:

% HGMERGE=internal:local hg merge     # keep my files
% hg revert --rev other-branch a.txt  # update a.txt to other branch
% hg commit -m 'Dummy merge to pick a.txt from other-branch.'

Возможно, это поможет вам немного.

Ответ 3

Я бы просто использовал внешний инструмент, например vimdiff, чтобы разделить два файла, которые я хочу объединить, а затем объединить их. Преимущество этого заключается в том, что вы можете выполнять выборочное редактирование на части файла. Например:

hg update -r branch-merging-to
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging

Для этого вам нужно включить внешние инструменты в вашем .hgrc, что просто означает добавление этих строк:

[extensions]
hgext.extdiff =