Если это возможно, я бы вообще не использовал две копии вашего контента. Это сделает объединение двух вместе более сложным. Однако, без дополнительной информации, я не могу предложить альтернативу, так что здесь.
Я предполагаю, что branch_a
и branch_b
имеют некоторые общие предки коммит, но не являются простыми форвардами друг друга,Если это так, это, скорее всего, не сработает, потому что любая попытка слияния приведет к ускоренной перемотке вперед, включая шаг переименования.
В branch_a
, который содержит «унаследованную» версию, переместите dir_1
к намеченному пути:
$ git checkout branch_a
$ git mv dir_1 dir_1-legacy
$ git commit -m 'Created separate folder'
Я бы порекомендовал сделать отдельную ветку для объединенного результата, чтобы вы могли сделать что-то вроде
$ git checkout -b branch_transition branch_b
Если вы предпочитаете просто обновить branch_b
с результатом, просто сделайте
$ git checkout branch_b
В любом случае, теперь вы можете объединить две папки, сохранив историю каждой:
$ git merge branch_a
CONFLICT (modify/delete): dir_1/XXX deleted in a and modified in HEAD. Version HEAD of dir_1/XXX left in tree.
...
Automatic merge failed; fix conflicts and then commit the result.
$ git add dir_1
$ git commit -m 'Merged divergent paths'
Шаг git add dir_1
необходимо в ответ на неудачное автоматическое слияние, которое в данных обстоятельствах является именно тем, что вам нужно.
Я бы также рекомендовал вернуть branch_a
назад на один коммит, чтобы любые будущие изменения в нем не работали напапка dir_1-legacy
:
git checkout branch_a
git reset --hard HEAD~
Повторное объединение
После завершения перехода вы можете объединить две папки, используя аналогичную технику. Допустим, вы находитесь на branch_transition
и хотите объединить две папки. Вы можете сделать это, создав новую временную ветвь, удалив одну версию папки в каждой из ветвей, переименовав одну и объединив:
git checkout branch_transition
# Create temp branch to hold the legacy code
git checkout -b temp_transition
git rm dir_1
git mv dir_1-legacy dir_1
git commit -m 'Converted legacy to baseline'
# Set up merge on the transition branch
git checkout branch_transition
git rm dir_1-legacy
# Do the merge
git merge --strategy ours temp_transition
git branch -d temp_transition
Вам потребуется использовать --strategy ours
, чтобы получить- легальная версия, чтобы превзойти унаследованную в соответствии с моими экспериментами. Это не то же самое, что делать --strategy recursive -X ours
, который не работает, как предполагалось.