Применение патчей, полученных по почте в Git
Перед тем, как интегрировать патч, который
прислали по почте, его нужно протестировать
в тематической ветке. Для выполнения
данной задачи есть две команды: git apply и
git am.
Рассмотрим сначала вариант с применением
команды git apply. Он используется
в случае, если патч был создан
командой git diff. Если патч,
полученный по почте, был сохранен в следующей
директории /tmp/change1.patch, то команда
будет выглядеть так:
git apply /tmp/change1.patch
В результате выполнения данной команды модифицируются файлы в рабочем каталоге сопровождающего проекта.
С помощью git apply можно проверить корректность
патча до его тестирования:
git apply --check 0001-change1.patch
В случае, если в терминале не появится
сообщение с ошибками, значит патч можно применять.
О появлении ошибки сигнализирует
сообщение с значением отличным
от 0.
Вариант с применением команды git am
используется в случае, если сотрудник сгенерировал
свои патчи командой format-patch. Команда git am
сразу читает патчи, сформированные в формате mbox и поэтому
не нужно их сохранять во временную папку, как при использовании
команды git apply:
git am 0001-change1.patch
В результате выполнения команды, патч сразу применяется,
при этом создается коммит, в котором уже есть
информация об авторе патча, извлеченная из заголовка письма,
а само сообщение коммита - берется из заголовка Subject
и содержания письма, не включая сам пересылаемый патч.
Если по время применения патча произошел конфликт,
например, главная ветка сильно расходится с веткой,
на которой был создан патч, то работа команды git am
будет остановлена и появится следующее сообщение с подсказкой
дальнейших действий:
Applying: See if this helps the gem
error: patch failed: ticgit.gemspec:1
error: ticgit.gemspec: patch does not apply
Patch failed at 0001.
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
Большое преимущество данной команды состоит, в том, что в патчи, где есть конфликты, добавятся специальные маркеры, упрощающие их поиск. Далее для решения конфликта необходимо отредактировать все файлы, исправить все конфликты, добавить их в индекс, а в самом конце выполнить следующую команду, чтобы перейти к новому патчу:
git am --resolved
Если нужно использовать несколько патчей из файла mbox,
то можно применить git am интерактивно, когда
при анализе каждого патча задается вопрос о
дальнейших действиях:
git am -3 -i mbox
Commit Body is:
--------------------------
See if this helps the gem
--------------------------
Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all
После того как все патчи применены и сделаны коммиты в текущей ветке, можно принять решение о их дальнейшей интеграции в основную ветку.