- Blog
- Emendando commits
Emendando commits
E outras dicas para deixar sua árvore mais concisa
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]
ougit add .
: para adicionar arquivos para suastage area
, para serem "commitados" futuramente;git commit -m
: para commitar os arquivos existentes nastage area
com uma mensagem específica;git checkout
(ou os novosgit restore
egit switch
, respectivamente): para remover arquivos alterados ou mudar de branch;- fora os mais corriqueiros como
git pull
egit 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"