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

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

↑