Слияние функциональной ветви после перемещения большого файла

#git #git-merge

#git #git-слияние

Вопрос:

Вначале мой репозиторий выглядел так:

 master:
    foo/
    bar/
    new-bar/
  

В ветке функций в new-bar было добавлено много коммитов:

 feature:
    foo/
    bar/
    𝒏𝒆𝒘-𝒃𝒂𝒓/
  

И в главной ветке bar был удален, а new-bar был перемещен на его место с git mv :

 master:
    foo/
    b̶a̶r̶/
    bar/
  

Я бы хотел объединить функциональную ветвь, не вызывая множества конфликтов:

 master:
    foo/
    b̶a̶r̶/
    𝒃𝒂𝒓/
  

Как мне это сделать?

Комментарии:

1. Что вы пробовали? Предпринимали ли вы конкретные действия, которые привели к конфликтной ситуации?

Ответ №1:

Из примечаний к выпуску для git 2.18:

  • Логика обнаружения переименования, которая используется в «слиянии» и «выборе вишни», научилась угадывать, когда все x / a, x / b и x / c переместились в z / a, z / b и z / c, вполне вероятно, что x / d добавился в то же времятакже хотелось бы перейти на z / d, воспользовавшись намеком на то, что весь каталог ‘x’ переместился в ‘z’.

AFAICT это распространяется на вашу область использования — просто используйте современную версию Git.

Комментарии:

1. Осторожно: это обновление логики определения переименования было ошибочным и было введено, а затем несколько раз отменялось во время разработки, до выпуска 2.18 (где оно считалось достаточно стабильным). В версии 2.19 git am было изменено, чтобы убедиться, что оно не используется, что, по-видимому, решает самую большую оставшуюся проблему. Я не думаю, что что-либо из этого действительно влияет на вариант использования OP, просто обратите внимание, что между 2.18 и 2.19 git am -3 иногда возникают ложные попадания из этого кода.

Ответ №2:

Если вы решите перебазировать свою функциональную ветку поверх master , переименование должно пройти довольно хорошо. Нужно попробовать. Как только перебазирование будет выполнено, ваша ветка должна быть такой же, как и раньше, за исключением того, что все изменения будут внесены в bar/ вместо new-bar/ .

Если вы решите не перебазировать ее, в верхней части вашей функциональной ветки я бы добавил коммит, который перемещается new-bar/ как bar/ , чтобы он был совместим с master , а затем объединил его.

В любом случае вам придется попробовать и посмотреть, что лучше соответствует вашим потребностям.