Как объединить две ветви с разными иерархиями каталогов в Git?
Я начал использовать Maven с проектом веб-приложения, поэтому иерархия каталогов изменилась. Я создал новую ветку для интеграции Maven. Теперь у меня есть две ветви: одна со старой иерархией каталогов и одна с иерархией каталогов maven. Обе ветви имеют новые коммиты (исправления и новые функции).
Я хотел бы избавиться от старой ветки и объединить ее изменения с веткой Maven. Git merge дает бесчисленные конфликты, которые кажется невозможным решить. Я считаю, что это потому, что пути к файлам изменились.
каков наилучший способ приблизиться к этому слиянию?
2 ответа:
попробуйте
merge.renameLimit
к чему-то высокому для этого слияния. git пытается обнаружить переименования, но только если количество файлов ниже этого предела, так как для этого требуется O(n^2) Время обработки:git config merge.renameLimit 999999
затем, когда сделано:
git config --unset merge.renameLimit
запись в блоге "слияние, git, переименование, слияние Oh my... " добавляет интересную информацию, которая иллюстрирует Роби ' s ответ (при поддержке):
при попытке обнаружить переименования git различает точные и неточные переименовывает С:
- первый-это переименование без изменения содержимого файла и
- последнее переименование, которое может включать изменения содержимого файла (например, переименование/перемещение класса Java).
это различие важно, потому что алгоритм обнаружения точных переименований является линейным и всегда будет выполняться, в то время как алгоритм обнаружения неточных переименований является квадратичным (
O(n^2)
) и git не пытается сделать это, если количество измененных файлов превышает определенный порог (1000 по умолчанию).если явно не установлено,
merge.renameLimit
умолчанию 1000 файлов или использует значение дляdiff.renameLimit
если установить.
Элементdiff.renameLimit
влияетgit diff
,git show
иgit log
покаmerge.renameLimit
применяется к попыткам слияния (git merge
,git cherry-pick
) только.это хорошая идея, чтобы изменить
merge.renameLimit
в отличие от измененияdiff.renameLimit
Так что git не пытается найти переименования во время обычных операций, таких как просмотрgit diff
выход.чтобы показать переименования, команды, как
git show
илиgit log
можно использовать-M
опция, которая поворачивается переименовать обнаружение ВКЛ.Да, для ядра, у меня есть
[diff] renamelimit=0
чтобы полностью отключить ограничение, потому что предел по умолчанию действительно очень низкий. Git довольно хорош при обнаружении переименования.
однако причина низкого значения по умолчанию не в том, что он недостаточно быстр - это потому, что он может в конечном итоге использовать много памяти (и если у вас мало памяти, обмен будет означать, что он переходит от "довольно быстрого" к "медленному, как патока", но он все равно не будет ограничен процессором, это просто подкачка, как сумасшедший).