Как объединить две ветви с разными иерархиями каталогов в Git?


Я начал использовать Maven с проектом веб-приложения, поэтому иерархия каталогов изменилась. Я создал новую ветку для интеграции Maven. Теперь у меня есть две ветви: одна со старой иерархией каталогов и одна с иерархией каталогов maven. Обе ветви имеют новые коммиты (исправления и новые функции).

Я хотел бы избавиться от старой ветки и объединить ее изменения с веткой Maven. Git merge дает бесчисленные конфликты, которые кажется невозможным решить. Я считаю, что это потому, что пути к файлам изменились.

каков наилучший способ приблизиться к этому слиянию?

2 53

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 довольно хорош при обнаружении переименования.

однако причина низкого значения по умолчанию не в том, что он недостаточно быстр - это потому, что он может в конечном итоге использовать много памяти (и если у вас мало памяти, обмен будет означать, что он переходит от "довольно быстрого" к "медленному, как патока", но он все равно не будет ограничен процессором, это просто подкачка, как сумасшедший).