Как подготовить и применить несколько патчей для последних N коммитов в git
Мне нужно создать файл патча для последних N коммитов и применить их как отдельные коммиты к другой ветке. Для N=3 я предполагаю, что должен сделать это:
git diff HEAD ~ 3 HEAD ~ 2 >> diff1
git diff HEAD ~ 2 HEAD ~ 1 >> diff2
git diff HEAD ~ 1 HEAD >> diff3
и затем примените их к другой ветви соответственно:
git apply diff1
(От себя)
git apply diff2
(От себя)
git apply diff3
Есть ли более короткий способ сделать это?
3 ответа
Это можно сделать с помощью git format-patch и git am соответственно. Из вашего примера попробуйте:
git format-patch HEAD~3
Это будет генерировать файлы 0001-commit-foo.patch
, 0002-commit-bar.patch
, 0003-commit-baz.patch
, Затем вы можете скопировать их в другой репо и использовать git am
применять их:
git am *.patch
Это сохранит коммиты, как вы сделали их в предыдущем дереве, включая сообщения коммитов, SHA и временные метки.
Вы упомянули в комментарии, что вам нужны патчи, потому что ветки находятся в разных проектах. Это не проблема. Вы можете добавить пульт для другого проекта, и вы можете выбрать его, даже если у них нет общей истории. Сбор вишни не имеет отношения к происхождению, он просто воспроизводит изменения, как это было бы с патчами.
Если по какой-то причине сбор вишни вам не подходит (хотя я действительно сомневаюсь), вы можете использовать циклы в Bash, например:
for ((i = 3, d = 1; i > 0; i--, d++)); do ((j = i - 1)); git diff HEAD~$i HEAD~$j > diff$d; done
Вы можете написать аналогичный цикл для git apply
команды.
Пытаться git cherry-pick
фиксирует в другую ветку (не нужно создавать временные патчи). Этот вопрос отвечает на вопрос, как выбрать несколько коммитов одновременно: Как выбрать несколько коммитов.