Gabriel / Ramos

⟨ pintor de pixel ⟩

  • Blog
  • Emendando commits

Emendando commits

E outras dicas para deixar sua árvore mais concisa

4 min. de leitura

Foto por Kelly Sikkema

Utilizar Git para versionamento de código (e até de outros arquivos) é uma tarefa corriqueira para grande maioria dos desenvolvedores.

É comum utilizarmos no nosso dia-a-dia uma vasta quantidade de comandos no terminal e muito provavelmente você já tem os seus favoritos. Dos que utilizamos com git, muito provavelmente você já está acostumado com:

  • git add [caminho-do-arquivo] ou git add .: para adicionar arquivos para sua stage area, para serem "commitados" futuramente;
  • git commit -m: para commitar os arquivos existentes na stage area com uma mensagem específica;
  • git checkout (ou os novos git restore e git switch, respectivamente): para remover arquivos alterados ou mudar de branch;
  • fora os mais corriqueiros como git pull e git push: para baixar alterações de um repositório remoto ou subir novas alterações para eles.

Acontece que, existem alguns outros comandos (e outras opções para comandos que já conhecemos) que podem nos auxiliar bastante diariamente na tarefa de versionar nosso código de uma forma limpa, e são alguns desses comandos que venho comentar.

Para exemplificar melhor, vou atrelar cada um dos comandos a um cenário específico. Acredito que dessa forma fique mais simples de lembrar essas utilizações.

Espero que com eles você consiga evitar novos commits desnecessários ou com alterações que não refletem alguma inserção significativamente histórica no seu projeto


Acabei de realizar meus commits, mas percebi que esqueci de remover algumas linhas (talvez aquele debugger; ou algum console.log)

Nesse cenário, uma boa pedida seria o git commit --amend. Após realizar um git add nesses arquivos e fazer as alterações que você esqueceu, você não precisa, necessariamente, escrever um novo commit apenas para remover essas linhas que acabaram sendo deixadas.

Com esse comando você "emenda" essas alterações no seu commit anterior.

Mas vale lembrar que: esse comando reescreve o commit anterior e insere esse novo arquivo (e te possibilita alterar a mensagem do commit também). Por consequência, o hash (aquele código único gerado) desse commit também é alterado. Isso significa que, se você já fez o push desses commits, precisará forçar o próximo push (com a opção -f, --force ou --force-with-lease).

Por isso, talvez não seja um comando tão interessante para utilizar quando estiver trabalhando em conjunto com outra pessoa numa mesma branch.

Acabei de criar uma branch quero deixar um PR aberto, ou preciso "forçar" o CI a rodar as verificações em um PR já existente

Muito provavelmente nesse caso você já está acostumado a criar um commmit "sem nada". Ou seja, alterar alguma linha de um arquivo README.md ou mudar algo no package.json do projeto apenas para criar um novo commit e poder abrir um PR ou fazer com que o CI rode novamente na sua branch no seu repositório remoto.

Para esse cenário, existe uma outra opção: git commit --allow-empty -m 'mensagem'. Esse comando faz exatamente o que a a opção sugere: ele cria um commit vazio, com uma mensagem especificada por você.

O que já resolve essa necessidade de realizar alterações simples manualmente só para gerar um novo commit na sua branch.

Criei alguns arquivos/pastas mas, após algumas definições e desenvolvimento, percebi que não preciso mais deles

Talvez você utilize, nesses casos, os comandos de rm para remover os arquivos e pastas manualmente. Como são novos na sua branch não será possível removê-los com git checkout (ou git restore).

Para esse caso, um comando que ajuda bastante é o git clean. Com algumas opções, esse comando permite que você apague esses arquivos e pastas sem ter que ficar manualmente excluindo eles.


Bônus

Configurando alias para comandos customizados

Se você já possui seus arquivos configurados e um setup automatizado (talvez seguindo algumas práticas de dotfiles, como costumo deixar os meus), talvez já conheça essa "técnica". Mas você consegue, no seu arquivo .gitconfig, configurar e customizar alguns aliases como se fossem comandos padrões do git, só que seguindo suas necessidades.

Para configurá-los, basta colocar a chave [alias] no seu .gitconfig e escrever seus comandos como:

[alias]
  opcao = comando

Dessa forma, ao utilizar git, o comando git opcao estaria configurada e pronta para utilização.

Eu costumo utilizar as seguintes configurações:

[alias]
  # Last commit's diff
  last = diff HEAD^ HEAD
  # Clean file and folders
  clear = clean -fd
  # Get current branch name
  current = "! git rev-parse --abbrev-ref HEAD"
  # Erase all branches except master and current branch
  erase = "! git branch | grep -v master | grep -v $(git current) | xargs git branch -D"

Compartilhe