2016-10-30 11 views
2

Мне нужно создать файл исправления для последних N коммиттов и применить их как отдельные фиксации к другой ветви. Для N = 3 Я думаю, что я должен сделать это:Как подготовить и применить несколько патчей для последних N коммиттов в git

мерзавца дифф ГОЛОВА ~ 3 ГОЛОВЫ ~ 2 >> diff1
мерзавца дифф ГОЛОВА ~ 2 ГОЛОВКИ ~ 1 >> diff2
подходят дифф ГОЛОВА ~ 1 ГОЛОВА >> diff3

, а затем применить их на другой ветви соответственно:

мерзавец применять diff1
(нажимной)
мерзавец применять ди ff2
(толчок)
мерзавец применять diff3

Есть ли более короткий путь, чтобы сделать это?

ответ

5

Это можно сделать с помощью 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 

Это сохранит совершающее, как вы сделали их в предыдущем дереве, включая сообщения фиксации, ШАС и временные метки.

+0

Если кто-то сталкивается с сообщением об ошибке «фатальный: не удалось открыть» * .patch 'for reading: Invalid argument "из msysgit, вот почему: https://groups.google.com/forum/#!topic/msysgit/1IT785Jf4Zo – Ilya

1

Попробуйте git cherry-pick совершает переход к другой ветке (нет необходимости создавать временные исправления). Эти вопросы отвечают на то, как выбирать несколько коммитов за один раз: How to cherry-pick multiple commits

+0

Мне нужен патч. Филиалы находятся в двух разных проектах. – Meysam

+1

Вы можете по-прежнему перемещаться между различными репозиториями, если добавить второй репо в качестве пульта к первому. – TomaszGuzialek

1

Вы упомянули в комментарии, что вам нужны патчи, потому что ветви находятся в разных проектах. Это не проблема. Вы можете добавить пульт для другого проекта, и вы можете выбирать из него, даже если они не имеют общей истории. Cherry-picking не касается родословной, это просто переигрывание изменений, как и с патчами.


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

 Смежные вопросы

  • Нет связанных вопросов^_^