Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Слияние веток, в одной из которых файлы были не переименованы, а удалены и созданы в другом каталоге


В последнем коммите ветки hometype есть изменения, которые должны быть в ветке master, но влить ее в мастер не получается, потому что в коммите Rename были изменены названия пакетов, что в общем означает новое местоположение файла/класса.
Получается, что в ветке master файлы, для которых есть изменения в hometype, находятся в других местах.
Как их теперь объединить, если это вообще возможно?


Ответ

судя по всему, git «не знает» о произведённых (в ветке master) переименованиях, и не может «связать» изменения, произведённые в другой (hometype) ветке (со «старыми» файлами), с файлами «новыми».

один из возможных (но не самый «изящный» из) путей «влить» изменения из другой ветки (hometype) в основную — получить патч из изменений, внесённых в ветке hometype, вручную исправить в нём имена файлов, и «наложить» патч в основной ветке командой git apply файл.с.патчем (см. man git-apply).
совет: тренироваться лучше на тестовой ветке, создав её командой git checkout -b тестовая-ветка исходная-ветка

изменять надо будет такие примерно строки:
diff --git a/file1 b/file1 index 88621c5..af3bc11 100644 --- a/file1 +++ b/file1
здесь имя файла, которое надо будет вручную исправить — file1, оно встречается четыре раза, и все четыре его появления надо исправить. будьте внимательны: так как у вас были исправления, судя по всему, нескольких файлов, то блоков таких будет больше одного.

получить патч из изменений, внесённых commit-ом, зная его хэш, можно, например, так:
$ git diff хэш^ хэш
запись хэш^ означает в данном случае «родительский» (parent) commit для данного commit-а
см. man git-diff на предмет подробностей об этой команде и man gitrevisions о смысле ^ и подобных модификаторов.

в будущем я бы порекомендовал переименования файлов/каталогов делать отдельным коммитом (отдельным от изменения содержимого этих же файлов). тогда программа git без дополнительных указаний должна распознавать такие переименования.
другой путь решения озвученной в вопросе проблемы (он более «изящен», но требует довольно длинного описания) как раз и основывается на указании программе git, какую долю изменений в файле, «удалённом в одном месте и созданном в другом», следует считать переименованием. для команды merge это делается с помощью опции rename-threshold стратегии recursive. см. описание этой опции в man git-merge и опции -M в man git-diff

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

Отправить комментарий