offline version v3
Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
menu

Применение патчей, полученных по почте в 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

После того как все патчи применены и сделаны коммиты в текущей ветке, можно принять решение о их дальнейшей интеграции в основную ветку.