Git объединяет поддеревья двух локальных веток

За свою жизнь я не могу получить git subtree merge работать. Вот моя ситуация:

Я работаю над встроенной частью Moodle, которая называется Workshop. Код живет в mod/workshop в moodle каталог. Я должен обновить мой локальный Moodle до 2.5 и заставить работать в нем изменения в моей мастерской. Итак, очевидное решение для меня:

  1. Оформить заказ MOODLE_25_STABLE ветвь вверх по течению
  2. Создать ветку под названием MOODLE_25_STABLE_workshop на основе этой ветви
  3. сливаться 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, но не может сказать когда различия устаревают другие изменения.

Другие вопросы по тегам