Git add - Como preparar alterações seletivamente
Quando começamos a aprender sobre como usar o Git, aprendemos que o fluxo básico de trabalho, superficialmente falando, é:
- Realizar as modificações nos arquivos;
git add
para incluir o[s] arquivo[s] alterado[s] na área de preparação (staging area);git commit
para adicionar todos os arquivos preparados ao repositório local;git push
para enviar todos os arquivos comitados no repositório local para o repositório remoto.
Uma das formas mais comuns de se usar o comando git add
é usando um .
como argumento, ou seja, incluindo todos os arquivos que sofreram alguma alteração. Outra forma é usando o nome de um ou mais arquivos específicos, para adicionar apenas estes à staging area, ou seja, preparar (stage) as alterações.
Mas qualquer uma destas formas prepara todas as modificações realizadas nos arquivos. E se quisermos preparar apenas parte das alterações?
Vamos para um exemplo:
Primeiro vamos iniciar um repositório local (para este artigo não vamos precisar de um repositóio remoto):
git init
Agora, criamos um arquivo chamado teste.txt
e adicionamos algum conteúdo ao mesmo:
echo "Uma frase qualquer" > teste.txt

Já temos uma modificação, então vamos adicioná-la e fazer o primeiro commit:

git add teste.txt

git commit -m 'Adiciona o arquivo teste.txt'

Agora, se alterarmos este arquivo, adicionando conteúdo antes e depois do conteúdo atual, teremos dois pedaços (hunk) de alteração, um antes do conteúdo antigo e outro depois:


Se o próximo comando for git add .
ou git add teste.txt
os dois hunks serão preparados, já que estão no mesmo arquivo. Porém existe uma forma de preparar um ou mais hunks seletivamente. É para isso que serve a flag --patch
ou, resumidamente -p
. De acordo com o manual (man git-add
):

Então, se rodarmos o comando git add -p
, nós vamos ter algumas opções para trabalhar com os pedaços de alteração:

y - preparar este pedaço
n - não preparar este pedaço
q - sair; não preparar este pedaço nem qualquer um dos pedaços restantes
a - preparar este pedaço e todos os outros pedaços restantes no arquivo
d - não preparar este pedaço nem qualquer um dos pedaços restantes no arquivo
s - dividir este pedaço em pedaços menores
e - editar manualmente este pedaço
? - exibir ajuda
Neste caso, o que queremos é dividir os pedaços, para podermos selecionar e preparar apenas uma parte para commitar. Então selecionamos a opção s
:

Agora, o git dividiu aquele pedaço em dois. Você pode estar se perguntando “Como ele sabe onde dividir?”. Bem, em termos bem simples, todo conteúdo não alterado é tratado como um possível splitpoint. No nosso caso, é a frase Uma frase qualquer
.
Então, temos agora algumas opções diferentes das primeiras, aplicando-se apenas ao primeiro pedaço, mas não vamos focar explorar as opções novas hoje. Vamos preparar este primeiro pedaço, com a opção y
. E como não vamos adicionar o segundo pedaço agora, pois queremos incluir essas alterações em um commit separado, usamos a opção d
em seguida:

Obs: Poderíamos ter usado a opção
q
também, mas como só temos um arquivo com alterações, neste caso o efeito prático é o mesmo.
Para confirmar que há alterações preparadas (staged) e alterações não preparadas (not staged) no mesmo arquivo, podemos usar o comando git status
, e para ver quais as alterações não preparadas pordemos usar o comando git diff
:

Agora, vamos fazer o commit da primeira alteração:

Agora podemos adicionar o segundo pedaço com git add teste.txt
, ou usar novamente o comando git add -p
para editar manualmente, já que neste caso não será possível dividir automaticamente, pois não temos nenhum conteúdo não alterado entre alterações. Não vamos editar manualmente neste artigo, vamos usar a opção y
:

Obs: Poderíamos ter usado a opção
a
também, mas como só temos uma alteração no arquivo, neste caso o efeito prático é o mesmo.

Para conferirmos que as alterações foram preparadas separadamente e estão em commits diferentes, podemos usar o comando git log -p

Esta é a forma que eu encontrei para preparar seletivamente as modificações que devem estar em cada commit. Você conhece alguma outra forma? Me conte nos comentários abaixo!
E assim chegamos ao fim deste artigo! Obrigado por ler até aqui e pela paciência com este escritor novato! Espero ter contribuído para a construção do seu conhecimento!
O que você achou deste conteúdo? Deixe um comentário abaixo com críticas, elogios ou sugestões para os próximos artigos.