Git-Logo-Black

Git: commit parcial de arquivos

Neste post demonstrarei uma das muitas features bacanas disponíveis no git, o commit parcial de arquivos. Esta feature permite ao usuário selecionar quais alterações de determinado arquivo devem ser commitados.

Vamos supor que existe o seguinte arquivo em um projeto:

Neste novo repositório existe um único commit:

partial_commit_1

A primeira alteração é feita:

partial_commit_2

Suponha que um colega solicita outra alteração no mesmo arquivo. Ele/Ela pede para alterar o nome da função foo() para xpto().
Depois de ambas mudanças o diff é:

partial_commit_3

Agora é hora de commitar as alterações. Entretanto, é necessário que cada alteração seja submetida em diferentes commits. Felizmente o git possui uma feature que nos ajuda em situações como essa. Os comandos git add e git commit permitem ao usuário selecionar quais partes do arquivos devem ser adicionadas. Isso é feito passando a opção -p, --patch. Em nosso exemplo, será utilizado git commit.

partial_commit_4

Como pode ser visto, git mostra cada alteração realizada e pergunta ao usuário o que deve ser feita com ela. As opções são: [y,n,q,a,d,/,s,e,?].
Para visualizar o texto de ajuda digite ?. O seguinte texto devera ser exibido:


y – stage this hunk
n – do not stage this hunk
q – quit; do not stage this hunk or any of the remaining ones
a – stage this hunk and all later hunks in the file
d – do not stage this hunk or any of the later hunks in the file
g – select a hunk to go to
/ – search for a hunk matching the given regex
j – leave this hunk undecided, see next undecided hunk
J – leave this hunk undecided, see next hunk
k – leave this hunk undecided, see previous undecided hunk
K – leave this hunk undecided, see previous hunk
s – split the current hunk into smaller hunks
e – manually edit the current hunk
? – print help

No exemplo, é mostrado o primeiro hunk de alteração do arquivo. Em nosso primeiro commit queremos apenas as alteração realizadas na função bar(), então o primeiro hunk deve ser ignorado. Assim, a opção n é a escolha certa.

partial_commit_5

Depois disso o git mostra todas as demais alterações como se fosse um único hunk, então é necessário quebra-las em alterações menores. Para isso existem duas opções: s e e. A primeira faz com que o git quebre o hunk em partes menores. A segunda, por sua vez, permite que o usuário escolha manualmente quais linhas alteradas devem ser inclusas. Para este pequeno tutorial iremos utilizar a opção s. Git devera mostrar algo semelhante a isso:

partial_commit_6

O hunk anterior foi quebrado em 3 partes. Então será iterado sobre todos eles perguntado ao usuário qual ação deve ser executada para cada um deles. O primeiro hunk criado também deve ser ignorado. O segundo hunk é a primeira alteração relacionada a função bar() e deve ser adicionado, para isso é necessário escolher a ação y.

partial_commit_7

O terceiro também deve ser adicionado ao commit

partial_commit_8

Quando não existir mais hunks a serem selecionados, como estamos utilizando o comando git commit, será aberto o editor para o usuário escrever a mensagem de commit. Após isso, está feito:

partial_commit_9

Agora que o primeiro commit contem apenas as alterações referentes a função bar(), as demais mudanças podem ser comitadas em um segundo commit:

partial_commit_10

Espero que vocês tenham gostado desta dica simples. Considero escrever um post cobrindo todas as demais opções não citadas neste texto (e.g. seleção manual de hunk, entre outras). Encorajo ao leitor brincar com as demais opção disponibilizadas.

  • Erick Fonseca

    Muito útil a dica. Estou começando a utilizar o git e já havia pensado nesse cenário, mas não sabia como fazer.
    Obrigado.

  • Erick Fonseca

    Muito útil a dica. Estou começando a utilizar o git e já havia pensado nesse cenário, mas não sabia como fazer.
    Obrigado.

  • Erick Fonseca

    Muito útil a dica. Estou começando a utilizar o git e já havia pensado nesse cenário, mas não sabia como fazer.
    Obrigado.