В начале мой репозиторий выглядел так:
master:
foo/
bar/
new-bar/
В функциональной ветке в новую панель добавлено много коммитов:
feature:
foo/
bar/
???-???/
А в ветке master bar был удален, а new-bar перемещен на его место с помощью git mv
:
master:
foo/
b̶a̶r̶/
bar/
Я хотел бы объединить ветку функций, не вызывая тонн конфликтов:
master:
foo/
b̶a̶r̶/
???/
Как мне это сделать?
Если вы решите перебазировать свою ветку функций поверх master
, переименование должно пройти довольно хорошо. Быть судимым. После того, как перебазирование будет выполнено, ваша ветка должна быть такой же, как и раньше, за исключением того, что все изменения будут сделаны в bar/
вместо new-bar/
.
Если вы решите не перебазировать его, в верхней части вашей функциональной ветки я бы добавил коммит, который перемещает new-bar/
как bar/
, чтобы он был совместим с master
, а затем объединил его.
В любом случае вам придется попробовать и посмотреть, что лучше соответствует вашим потребностям.
Из Примечания к выпуску для git 2.18:
- Rename detection logic that is used in "merge" and "cherry-pick" has learned to guess when all of x/a, x/b and x/c have moved to z/a, z/b and z/c, it is likely that x/d added in the meantime would also want to move to z/d by taking the hint that the entire directory 'x' moved to 'z'.
AFAICT это покрывает ваш вариант использования - просто используйте современную версию Git.
Осторожно: это обновление логики определения переименования содержало ошибки, и оно было вставлено, а затем несколько раз отменено во время разработки, до выпуска 2.18 (где оно было сочтено достаточно стабильным). В 2.19 git am
был изменен, чтобы убедиться, что он не использует его, что, по-видимому, решает самую большую оставшуюся проблему. Я не думаю, что что-либо из этого действительно влияет на вариант использования OP, просто обратите внимание, что между 2.18 и 2.19 git am -3
иногда получает ложные срабатывания от этого кода.
Что вы пробовали? Предпринимали ли вы конкретные действия, которые привели к возникновению конфликтной ситуации?