Do Zero: git add -p - Qual é a desse comando simples e muito útil?
Tags: beginners, git, tutorial
Published: 2020-12-26 18:31:48

Se você está iniciando agora nos estudos e/ou carreira de desenvolvimento de software, provavelmente já deve ter **criado seu GitHub** e **iniciando o versionamento** dos seus projetos **usando o Git**, certo?

Se a resposta é "**Ainda não** 😔", fique tranquila! [Aqui tem um tutorialzinho básico](https://dev.to/devgirls/do-zero-git-github-como-criar-primeiro-repositorio-e-subir-seu-primeiro-projeto-4ce3) pra criar seu primeiro repositório no GitHub, versionar seu projeto e subir ele pro novo repositório, criando sua vitrine para expor seus projetos e estudos sobre programação.

Agora, se a resposta é "**Claro! Já estou apanhando do Git!**", você está no lugar certo!

Hoje, esse tutorial tem por objetivo falar um pouco sobre um dos comandos mais básicos do Git, o **_git add_**, porém abordando uma variante que vai te surpreender: o parâmetro "**_-p_**".

O comando "**_git add_**" é muito famoso por "adicionar conteúdo" (propor uma mudança qualquer, seja ela alterar, adicionar ou remover um conteúdo) de um arquivo local ao índice ou staging area, que terá a mudança confirmada, posteriormente, com o comando "**_git commit_**", e finalmente enviada ao repositório remoto pelo "**_git push_**". 

Então, _resumindo bem rasamente_, esse conjunto de comandos, iniciado pelo git add, são os responsáveis por "**salvar**" nossas alterações no projeto:

1. Fiz uma alteração local em um ou mais arquivos
2. Vou **propor essa mudança**, com o comando git add, adicionando ela no índice(staging area).
3. **Confirmo que quero realizar essa mudança** com git commit, fazendo uma "captura/**instantâneo**" daquele estado do projeto, incluindo as mudanças propostas pelo git add.
4. **Envio** com git push esse "instantâneo" do meu **repositório local** para o **repositório remoto**.

Bom, mas o foco desse artigo é te dizer para que serve o tal do -p junto com o git add, então vamos ao que interessa!

Para introduzir o assunto, quero confessar que passei seis meses trabalhando como desenvolvedora e vários outros meses apenas estudando e sempre utilizava o git add da seguinte forma:
![gif triste](https://media.giphy.com/media/a9xhxAxaqOfQs/giphy.gif)
**_git add ._** que adicionava todos os arquivos/diretórios alterados (criados, modificados, deletados) à proposição de mudança do index.
**_git add meu_arquivo.java_** que adicionava apenas arquivos ou diretórios especificados por mim

E um belo dia, pareando com um colega de time, vi que ele utilizava o **_git add -p_** e que dessa forma conseguia, posteriormente, **"organizar" melhor seus commits em etapas**, agrupando alterações que tinham relação uma com as outras, o que no fim das contas produzia uma _Pull Request_ muito mais fácil de analisar, mesmo que contivesse muitas alterações.
![gif michael the office](https://media.giphy.com/media/XR9Dp54ZC4dji/giphy.gif)

O parâmetro **_-p_** passado após o comando **_git add_**, é de "_patch_" ou "_fragmento_" em português, e permite que você selecione **interativamente** os "**_pedaços_**" que deseja **adicionar ao índice** e revise as **diferenças** antes de adicionar essas alterações.

Dessa forma, é possível adicionar aos poucos, agrupando para o commit, as alterações relacionadas e que façam sentido estar no mesmo commit.

A cada fragmento de alteração exibido (com as diferenças), é possível realizar algumas ações, dentre as quais, estão as que considero mais úteis, listadas abaixo:
* **y** - adicione este pedaço de alteração
* **n** - não adicione
* **d** - não adicione este, nem os remanescentes do arquivo
* **a** - adicione este e os outros pedaços restantes do arquivo 
* **q** - interrompe a adição, mantendo o que já foi adicionado

Na imagem seguinte temos os arquivos modificados em minha branch. Quero apenas adicionar os pedaços do arquivo **_TotalizerController.java_**, observando as diferenças que realizei.
![resultado comando git status](https://dev-to-uploads.s3.amazonaws.com/i/mgsxayyd2xl6mz2tjlei.png)

Ao rodar o comando **_git add -p_** temos o seguinte:
![resultado comando git add -p](https://dev-to-uploads.s3.amazonaws.com/i/rf1cw09hc8f33pcivuqx.png)
1. Na primeira linha vemos o comando git diff e o **nome do arquivo que está sendo "comparado"** naquele momento.
2. Em verde, vemos a **linha que foi adicionada** neste arquivo. Se fosse uma linha removida, veríamos ela em vermelho.
3. E por último, vemos as **opções disponíveis** que foram citadas acima.

No vídeo abaixo, demonstro como **ignorar** algumas alterações (utilizando a opção - **n**) para que não entrem no commit específico que quero fazer de alterações no controller. Dessa forma, vou **adicionar** (com a opção **y**) apenas os pedaços que tenham ligação com essa alteração, e em seguida, **interromper** a adição (com a opção **q**) quando já tiver colocado no index os pedaços que quero commitar.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/lv7j8nl6a1ekp12wu98q.gif)

Viu como pode ser fácil organizar em commits distintos, agrupando as alterações de forma lógica, mesmo que tenhamos feito muitas mudanças? 
![magic](https://media.giphy.com/media/4MY6xgrmYYsCX6srMQ/giphy.gif)