Как подготовить и применить несколько патчей для последних 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 фиксирует в другую ветку (не нужно создавать временные патчи). Этот вопрос отвечает на вопрос, как выбрать несколько коммитов одновременно: Как выбрать несколько коммитов.

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