Слейте две ветви и держите обе чаги в разорванных папках - PullRequest
1 голос
/ 04 ноября 2019

У меня есть две ветви, branch_a и branch_b.

branch_a:

dir_1/a lot of files

branch_b:

dir_1/a lot of changes

Теперь я думаю, что было бы лучше, если бы вместо простого слияния я оставил сейчас оба каталога.

Желаемый результат:

dir_1/a lot of files
dir_2/a lot of changes

ПричиныЯ мог бы просто скопировать все файлы из branch_b в dir_2, но это потеряло бы историю. Есть ли «мерзавец», чтобы решить эту проблему?

1 Ответ

1 голос
/ 04 ноября 2019

Если это возможно, я бы вообще не использовал две копии вашего контента. Это сделает объединение двух вместе более сложным. Однако, без дополнительной информации, я не могу предложить альтернативу, так что здесь.

Я предполагаю, что 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, который не работает, как предполагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...