'Слить конфликты, если слишком много изменений, должны быть применены во время перебазирования. Как правило, вы можете помочь git, не переустанавливая напрямую, чтобы справиться, но выполнять перестановки на меньших шагах от фиксации до фиксации.
На самом низком уровне git не знает о «перемещениях файлов». Он знает только об удалении и создании нового файла. Однако, если оба происходят при одной и той же фиксации, и удаленный и вновь созданный файл достаточно схожи, однако git предполагает, что фактически произошло «перемещение файла» и ведет себя соответствующим образом (например, при применении коммитов во время переустановки).
Итак, идти, как это:
Разделите реорганизацию на несколько коммитов, каждый из которых не более 50-70 файлов. Это помогает правильно распознавать движения.
Не делать любых других изменений, но только файл перемещается в этих фиксациях! Разрешено только изменение имени нового пакета, если исходные коды меняют пакет Java.
Нанести два тега в свой проект: «premoves» до последней фиксации перед тем движение совершает, «postmoves» до последнего из движущаяся совершающего. Я сделал это в gitk.
Теперь у вас есть все ветви вашей функции перед фиксацией с тегом «premoves». Выполните переустановки в три этапа:
1) Восстановите ветвь до фиксации «премокает». Поскольку раньше не было файлов, это «нормальная» перестановка со всеми обычными колокольчиками и свистами.
2) Теперь выполните «gm rebate postmoves». Это переводит вашу ветвь на реструктуризацию. Поскольку основная ветвь содержит только перемещения файлов, а ваша ветка свойств содержит фактические изменения содержимого в файлах, git должен иметь возможность обрабатывать ситуацию автоматически в значительной степени. Тем не менее, вы получите конфликты слияния на файлы, которые вы удалили в ветви функции.
Решите эти конфликты слияния вручную, указав, что удаленный файл ветки функции также должен быть удален на ветке реструктурированной функции (помните, git не знает о семантике. Он просто видит: «С одной стороны, файл был перемещен, а с другой - удален. Я не знаю, что делать ».) Я сделал это в git gui, произнеся« Take remote version »(удаленный? local?) Тот, который показан в окне diff как «DELETED»)
После этой перезагрузки все файлы, которые вы изменили на ветке функций, должны находиться в реструктурированной позиции со всеми их изменениями. Удаленные файлы ветки функции все еще удаляются. Остается только проблема: новые файлы в ветви функции.
Эти новые файлы, вам нужно переместить их вручную в правильное положение. Помните, git только видит файлы, он не имеет понятия о «перемещении структур каталогов вокруг». Итак, переместите ваши новые файлы в ветви свойств в их новые правильные позиции и примените git-коммиты для них.
Я бы предложил совершить эти перемещения файлов для каждого файла отдельно, а затем использовать «git rebase -i» и «fixup» файл move commit с последним фиксатором ветки функции, которая коснулась файла. Это предотвращает слишком много загромождения.
3) После того, как все это сделано, выполните окончательный «мастер переустановки git» (или что-то еще). Это теперь также стандартная rebase, поскольку реструктуризация уже произошла на ветке функций.
Ваше решение очень интересно и эффективно, большое вам спасибо! – WaZaA