Git apply: colocando os patch files em stage
Tags: git
Published: 2021-09-27 12:20:20

No [último post](https://dev.to/poveda/git-patch-compartilhamento-de-commits-alem-do-remote-3j88) mostrei como podemos utilizar arquivos patch para compartilhar mudanças e commits quando não temos acesso ao remote. A abordagem utilizada coloca as alterações diretamente na árvore de commits e possui mecanismos para evitar duplicidades no momento da aplicação. 

> Mas se eu quiser revisar as alterações antes de aplicar o commit na árvore?

É justamente para esse cenário que existe o git apply

## [Git apply](https://git-scm.com/docs/git-apply)

O comando **git apply** aplica as mudanças que estão dentro dos arquivos *.patch* aos arquivos correspondentes dentro da pasta de trabalho.

Para adicionar as mudanças basta executar o comando abaixo
```shell
git apply patch-commits/0001-Adiconadas-mais-motoriza-es-a-base.patch
```

Após a execução do comando temos a área de staging com os arquivos alterados
```shell
~/mongoblogposts$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   db_data/carro_dump.json

no changes added to commit (use "git add" and/or "git commit -a")
```
E analisando os logs dos commits, nota-se que nenhum novo commit foi adicionado à árvore
```shell
~/mongoblogposts$ git log -1 --oneline
65182aa (HEAD -> main, origin/main) Material post git patch
```
Verificando quais arquivos foram alterados no último commit:
```shell
~/mongoblogposts$ git show -1 --compact-summary
commit 65182aa52f918b567e33545bd15f3bea93d67c58 (HEAD -> main, origin/main)
Author: Juliano Poveda <julianopoveda@github.com>
Date:   Mon Sep 13 09:41:58 2021 -0300

    Material post git patch

 patch-commits/0001-Adiconadas-mais-motoriza-es-a-base.patch (new)     | 386 ++++++++++++++++++++++++++++++++++++++++++
 patch-commits/0002-Reformata-o-readme-criacao-do-ambiente.patch (new) |  45 +++++
 patch-commits/readme.md (new)                                         |  83 +++++++++
```
Viram! As alterações estão na área de staging e não há nenhum novo commit na árvore.

## O parâmetro [--check](https://git-scm.com/docs/git-apply#Documentation/git-apply.txt---check)

O apply por padrão já verifica se é possível adicionar as alterações, no entanto, em determinadas ocasiões é bom fazer uam verificação do arquivo .patch antes de adicionar suas alterações. O parâmetro **--check** faz justamente esta validação. Caso os arquivos estejam aptos a serem adicionados à área de staging, nenhuma mensagem é retornada

```shell
~/mongoblogposts$ git apply patch-commits/0001-Adiconadas-mais-motoriza-es-a-base.patch
```
Já se o arquivo não estiver apto, o comando emite a mensagem
> *error: patch failed: db_data/carro_dump.json:2*
> *error: db_data/carro_dump.json: patch does not apply*

Note que quando é passado **--check** no comando, as alterações constantes nos arquivos de patch não são aplicadas à área staging. Para que as alterações sejam aplicadas é necessário adicionar o parâmetro **[--apply](https://git-scm.com/docs/git-apply#Documentation/git-apply.txt---apply)** ou rodar o comando sem o **--check**

## Impressões e Conclusão
Este comando ao contrário do git am, nos permite fazer um "PR local" antes de adicionar as alterações à árvore. 
Então, na próxima vez que ficares sem acesso ao repositório remoto e precisares entregar aquela tarefa super importante, acessa essa mini série e relembra como fazer a passagem das alterações por patch files :).

Os arquivos para teste, são os mesmos do post anterior(pasta patch-commits) e estão disponíveis no github.
{%github https://github.com/julianopoveda/mongoblogposts no-readme %}

## Referências
https://git-scm.com/docs/git-apply