git объединить две ветки с разными структурами каталогов

У меня есть функциональная ветвь и основная ветвь, и я хочу объединить основную ветвь с функциональной ветвью. Проблема в том, что структуры каталогов двух ветвей не совпадают.

Структура каталогов ветки функций выглядит следующим образом:

|── app1
│   ├── common
│   └── static
└── app2

Структура каталогов ветки master:

|── app1
│── common
│── static
└── app2

Теперь в основной ветке я обновляю папки «общие» и «статические». Затем я собираюсь объединить основную ветку с функциональной веткой, чтобы обновить папки «common» и «static» в «app1». Однако, поскольку структуры двух веток не совпадают, git будет считать эти две папки новыми. Как сделать слияние, чтобы обновить ветку функций?


person Nai    schedule 18.05.2017    source источник


Ответы (1)


Структура каталогов двух ветвей не имеет особого значения, кроме по сравнению с фиксацией merge base.

Git выполняет слияние, сравнивая базовую фиксацию слияния с двумя фиксациями на конце ветки. Таким образом, ваш вопрос сформулирован неправильно: он действительно должен быть связан с тем, как базовая фиксация слияния сравнивается с двумя фиксациями подсказки. Конечно, если два коммита на конце ветки имеют разные макеты каталогов, максимум один из них может совпадать с макетом каталога базы слияния. Но возможно, что ни один не соответствует этому макету.

Когда Git выполняет два сравнения, от базы слияния до подсказки №1, а затем от базы слияния до подсказки №2, он включает обнаружение переименования в обоих сравнениях. Если это обнаружение переименования правильно находит все переименованные файлы, Git правильно объединит файлы. В какой бы степени Git не смог правильно идентифицировать файлы с одинаковым содержимым и разными именами, вам придется объединять файлы вручную.

Вы можете немного помочь Git в обнаружении переименования, используя аргумент -X find-renames=<n> или -X rename-threshold=<n>. Это число n является тем же аргументом "индекса сходства", который вы можете передать в git diff как -M или --find-renames. (Имя rename-threshold — это старое имя, измененное относительно недавно, чтобы параметр git merge соответствовал параметру git diff.) Обратите внимание, что существует ограничение на количество файлов, для которых Git также будет определять переименование. Этот предел по умолчанию выше для git merge (сейчас 1000), чем для git diff (сейчас 400). (Эти ограничения были меньше в более старых версиях Git, до 1.7.5, но все они настраиваются; см. diff.renameLimit и merge.renameLimit в документация git config. См. также Как объединить изменения в Git в файлах, которые я переместил?)

person torek    schedule 18.05.2017