Git объединяет поддеревья двух локальных веток
За свою жизнь я не могу получить git subtree merge
работать. Вот моя ситуация:
Я работаю над встроенной частью Moodle, которая называется Workshop. Код живет в mod/workshop
в moodle
каталог. Я должен обновить мой локальный Moodle до 2.5 и заставить работать в нем изменения в моей мастерской. Итак, очевидное решение для меня:
- Оформить заказ
MOODLE_25_STABLE
ветвь вверх по течению - Создать ветку под названием
MOODLE_25_STABLE_workshop
на основе этой ветви - сливаться
mod/workshop
от моегоMOODLE_23_STABLE_workshop
разветвляться вMOODLE_25_STABLE_workshop
Это было бы легко, если бы я хотел объединить каждый файл из MOODLE_23_STABLE_workshop
в MOODLE_25_STABLE_workshop
но меня интересует только воспроизведение моих коммитов на mod/workshop
каталог. Есть ли более простой способ, чем cherry-pick
мой путь через шесть месяцев коммитов? Потому что я действительно очень не хочу этого делать.
Вещи, которые я уже пробовал:
$ git subtree merge --prefix=mod/workshop/ MOODLE_23_STABLE_workshop:mod/workshop
error: 402c67f6fedc96a6fed76e663df4e5af9dfa094e: expected commit type, but the object dereferences to tree type
а также
$ git merge -s ours --no-commit MOODLE_23_STABLE_workshop
$ git read-tree --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
error: Entry 'mod/workshop/aggregate.php' overlaps with 'mod/workshop/aggregate.php'. Cannot bind.
$ gormster:Documents/moodle$ git read-tree -m --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
fatal: Which one? -m, --reset, or --prefix?
Любое руководство приветствуется.
1 ответ
Что ж, слияние (без рекурсивной части стратегии работы с перекрестным слиянием) - это просто исправление локального дерева с помощью diff от самого последнего общего предка до удаленного.
Есть команда, чтобы получить базу слияния, git merge-base
, но git diff
даже может вызвать его самостоятельно, если вы используете ...
(3 вместо 2 точек) оператор.
Итак, слияние это:
git diff HEAD...MOODLE_23_STABLE_workshop -- mod/workshop/ | git apply -3
и чем вы это делаете.
Вы, вероятно, не должны пытаться записывать MOODLE_23_STABLE_workshop
в качестве базы, потому что это действительно не так. Если вы это сделаете, то при следующем слиянии вы предполагаете, что вы объединили все изменения и явно отменили те, которые были внесены за пределы mod/workshop/
, С другой стороны, если вы не записываете родителя, следующее объединение попытается повторно применить изменения, вызывая ненужные конфликты, если те же области изменяются снова, поскольку git достаточно умен, чтобы распознавать уже примененный diff, но не может сказать когда различия устаревают другие изменения.