Страницы

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

среда, 25 декабря 2019 г.

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

#git #git_merge




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

Получается, что в ветке master файлы, для которых есть изменения в hometype, находятся
в других местах.

Как их теперь объединить, если это вообще возможно?
    


Ответы

Ответ 1



судя по всему, 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.

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

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