git commit
Registrar mudanças no repositório
O comando 'git commit' cria um commit novo com o conteúdo atual do índice (área de preparação) e uma mensagem que descreve as mudanças. O commit novo é filho direto do HEAD e vira a nova ponta da branch atual. Cada commit é um snapshot permanente do histórico do projeto, que pode ser revisto, comparado ou restaurado a qualquer momento.
Sinopse
git commit [-a] [-m <msg>] [--amend] [--no-edit] [-v] [-n] [--dry-run] [-s] [-S] [--] [<pathspec>...]Opções
Escolhendo a opção certa
Opções de mensagem
Jeitos diferentes de informar ou editar a mensagem do commit
| Comando | Origem | Abre o editor | Caso de uso |
|---|---|---|---|
git commit -m "msg" | Na linha | ✗ | Commits rápidos com mensagens curtas |
git commit -F file | Arquivo | ✗ | Mensagem já escrita em um arquivo |
git commit -t file | Modelo | ✓ | Começar com um modelo no editor |
git commit -e | Editor | ✓ | Forçar o editor mesmo com -m |
git commit -C <commit> | Copiar | ✗ | Reusar a mensagem de outro commit |
git commit -c <commit> | Copiar + editar | ✓ | Editar a mensagem de outro commit |
Limpeza da mensagem
Como a mensagem do commit é processada antes de ser salva
| Comando | Modo | Remove comentários | Remove espaços | Ideal para |
|---|---|---|---|---|
--cleanup=strip | strip | ✓ | ✓ | A maioria dos commits |
--cleanup=whitespace | Espaços | ✗ | ✓ | Manter comentários # |
--cleanup=verbatim | Literal | ✗ | ✗ | Preservar a mensagem exatamente |
--cleanup=scissors | Tesoura | Só abaixo da linha da tesoura | ✓ | Manter linhas # ao usar o editor |
Autor e data
Mudar quem fez o commit e quando
| Comando | Substitui | Formato | Uso típico |
|---|---|---|---|
--author="Name <email>" | Autor | Nome <email> | Fazer commit em nome de outra pessoa |
--date="date" | Data de autoria | ISO 8601 / relativa | Colocar datas retroativas em commits |
--reset-author | Ambos | Usuário/hora atuais | Assumir a autoria de um patch aplicado |
Amend e correção do histórico
Opções para modificar commits existentes
| Comando | Cria | Modifica o HEAD | Usar com |
|---|---|---|---|
git commit --amend | Substituição | ✓ | Corrigir a mensagem ou o conteúdo do último commit |
git commit --fixup=<sha> | commit fixup! | ✗ | git rebase -i --autosquash |
git commit --squash=<sha> | commit squash! | ✗ | git rebase -i --autosquash |
O que entra no commit
Controlar quais arquivos entram no commit
| Comando | Prepara antes | Commits | Diretório de trabalho |
|---|---|---|---|
git commit | ✗ | Só o preparado | Sem mudanças |
git commit -a | Arquivos rastreados | Todos os rastreados | Sem mudanças |
git commit -i <file> | Indicados | Preparado + arquivo | Sem mudanças |
git commit -o <file> | Só os indicados | Só o arquivo | Outros preparados ficam de fora |
git commit -p | Interativo | Trechos escolhidos | Sem mudanças |
Assinatura GPG
Assinar commits criptograficamente para verificação
| Comando | Ação | Chave usada | Quando usar |
|---|---|---|---|
git commit -S | Assinar | Chave GPG padrão | Provar a autenticidade do commit |
git commit -S<keyid> | Assinar | Chave específica | Usar outra chave de assinatura |
git commit --no-gpg-sign | Não assinar | Nenhum | Anular commit.gpgSign=true |
Controle de hooks
Pular ou controlar os hooks pre-commit e post-commit
| Comando | Pula | Nível de risco | Quando usar |
|---|---|---|---|
git commit --no-verify | pre-commit + commit-msg | Médio | Correção urgente, arrumar os hooks depois |
git commit --no-post-rewrite | post-rewrite | Baixo | Pular o processamento lento pós-amend |
Dry-run e formato de saída
Ver o que entraria no commit sem fazer o commit
| Comando | Formato | Interpretável | Mostra |
|---|---|---|---|
--dry-run | Longo (padrão) | ✗ | Status completo com dicas |
--dry-run --short | Curto | ✓ | Códigos de status compactos |
--dry-run --porcelain | Porcelain | ✓ | Formato estável para scripts |
--dry-run --branch | Com a branch | ✓ | Adiciona informações de rastreamento ao formato curto |
--dry-run -z | Separada por NUL | ✓ | Seguro para nomes de arquivo especiais |
Status mostrado no editor
Controlar o que aparece no editor ao escrever a mensagem
| Comando | No editor | Efeito |
|---|---|---|
git commit --status | Status como comentários | Ver os arquivos do commit (padrão) |
git commit --no-status | Sem lista de arquivos | Editor mais limpo, menos distração |
git commit -v | Diff completo | Revisar as mudanças exatas enquanto escreve |
git commit -q | Editor normal | Ocultar o resumo depois do commit |
Commits especiais
Criar commits em situações incomuns
| Comando | Permite | Cria commit | Caso de uso |
|---|---|---|---|
--allow-empty | Nenhuma mudança | ✓ | Gatilhos de CI, marcadores de branch |
--allow-empty-message | Sem mensagem | ✓ | Scripts automatizados (não recomendado) |
--trailer "Key: value" | Metadados | ✓ | Co-authored-by, Fixes, Reviewed-by |
Exemplos de fluxos de trabalho
git add .Preparar as suas mudanças
git commit -m "Fix typo in README"Fazer commit com uma mensagem curta
git add -APreparar todas as mudanças
git commitAbre o editor para uma mensagem de várias linhas
(Write: subject line, blank line, detailed body)Seguir a regra 50/72 de formatação
git add forgotten-file.jsPreparar o arquivo esquecido
git commit --amend --no-editAdicionar ao último commit sem mudar a mensagem
git commit --amend -m "Corrected message"Substituir o último commit com uma mensagem nova
git commit -a -m "Update config files"Preparar automaticamente os arquivos rastreados modificados/excluídos e fazer commit
git add .Preparar as mudanças
git commit -S -m "Verified security patch"Criar um commit assinado com GPG
Teclas do editor e do modo interativo
Atalhos de teclado quando o Git abre um editor para a mensagem do commit, ou nos modos interativos.
Vim (padrão em muitos sistemas)
core.editor = vimNano
core.editor = nanoVS Code
core.editor = "code --wait"Modo patch (-p)
git commit -pSolução de problemas
no changes added to commit (use "git add" and/or "git commit -a")
Causa: Arquivos mudaram, mas nada foi preparado - você esqueceu de rodar 'git add'. (Se aparecer 'nothing to commit, working tree clean', não há nenhuma mudança.)
Prepare as mudanças com 'git add' antes do commit. Use 'git status' para ver o que precisa ser preparado.
git add . && git commit -m "message"Please tell me who you are (Author identity unknown)
Causa: O Git exige user.name e user.email configurados antes do seu primeiro commit.
Configure a sua identidade globalmente ou para este repositório.
git config --global user.name "Your Name" && git config --global user.email "you@example.com"Aborting commit due to empty commit message
Causa: Você fechou o editor sem escrever uma mensagem, ou a mensagem só tinha comentários.
Escreva uma mensagem de commit no editor, ou use a opção '-m' para uma mensagem na linha.
git commit -m "Your message here"O hook pre-commit falhou
Causa: Um hook pre-commit (lint, testes, formatação) encontrou problemas e bloqueou o commit.
Corrija os problemas apontados pelo hook. Só pule com '--no-verify' se for absolutamente necessário.
git commit --no-verify -m "message"O hook commit-msg falhou
Causa: A sua mensagem de commit não segue o formato exigido pelas convenções do projeto.
Siga a convenção de mensagens de commit do projeto (por ex., o formato Conventional Commits).
git commit -m "feat: add new feature"Changes not staged for commit
Causa: Você modificou arquivos, mas não os adicionou à área de preparação.
Use 'git add' para preparar arquivos específicos, ou 'git commit -a' para preparar automaticamente os arquivos rastreados.
git add <file> && git commit -m "message"error: failed to push some refs (depois de um amend)
Causa: Você fez amend de um commit já enviado, criando um histórico divergente.
Faça force push (se só você usa a branch) ou faça revert e crie um commit novo.
git push --force-with-leaseYour branch is ahead of 'origin/main' by X commits
Causa: Você tem commits locais que ainda não foram enviados.
Isso é normal! Envie quando estiver pronto, ou continue trabalhando localmente.
git push origin mainDicas e armadilhas
Boas práticas
- ✓Escreva mensagens de commit claras: comece com um verbo (Add, Fix, Update, Remove) e mantenha o assunto abaixo de 50 caracteres.
- ✓Use o imperativo: escreva 'Add feature', não 'Added feature' - imagine completar “This commit will...”
- ✓Faça commits atômicos: cada commit deve representar uma única mudança lógica. Não misture correções de bugs com funcionalidades novas.
- ✓Revise antes do commit: use 'git diff --staged' para ver exatamente o que vai entrar.
- ✓Nunca faça amend de commits já enviados: o amend reescreve o histórico. Só altere commits que não foram compartilhados.
- ✓Separe o assunto do corpo com uma linha em branco: em mensagens longas, a primeira linha é o assunto, depois uma linha em branco e então os detalhes.
- ✓Quebre o corpo em 72 caracteres: isso garante a leitura em terminais e na saída do git log.
- ✓Cite os números das issues: inclua 'Fixes #123' ou 'Closes #456' para ligar os commits ao controle de issues.
- ✓Faça commit com frequência e push com menos frequência: commits pequenos e frequentes são mais fáceis de revisar e reverter do que grandes.
- ✓Não faça commit de arquivos gerados: deixe artefatos de build, dependências (node_modules) e arquivos compilados fora dos commits.
Erros comuns
- ✗Rodar 'git commit' sem preparar as mudanças antes: é preciso usar 'git add' primeiro, a não ser com 'git commit -a', que só prepara arquivos rastreados.
- ✗Escrever mensagens vagas como 'fix' ou 'update': use mensagens claras e descritivas que expliquem POR QUE a mudança foi feita.
- ✗Fazer commit de muitas mudanças sem relação de uma vez: faça commits atômicos - uma mudança lógica por commit, para facilitar revisão e reversão.
- ✗Usar --amend em commits já enviados para branches compartilhadas: o amend reescreve o histórico e vai causar problemas para os outros.
- ✗Esquecer de configurar user.name e user.email: o Git exige a identidade do autor antes do seu primeiro commit.
Perguntas frequentes
'git commit' só inclui o que está na área de preparação. 'git commit -a' prepara automaticamente todos os arquivos rastreados modificados ou excluídos antes do commit - mas NÃO os arquivos novos não rastreados. Para arquivos novos, você ainda precisa de 'git add'.
Para commits não enviados: 'git reset --soft HEAD~1' mantém as mudanças preparadas, 'git reset HEAD~1' (o mesmo que --mixed) tira da preparação, 'git reset --hard HEAD~1' descarta. Para commits enviados: use 'git revert HEAD' para criar um commit novo que desfaz as mudanças.
Para o último commit: 'git commit --amend -m "New message"'. Para commits mais antigos: use 'git rebase -i' e troque 'pick' por 'reword'. Nunca faça isso em commits já enviados para branches compartilhadas.
O Git abre o editor configurado para você escrever uma mensagem. Se você fechar sem salvar uma mensagem, o commit é cancelado. Use '-m' para uma mensagem na linha ou '--allow-empty-message' para fazer commit sem mensagem (não recomendado).
Prepare os arquivos extras com 'git add <file>' e depois rode 'git commit --amend --no-edit'. Eles entram no commit anterior sem mudar a mensagem.
'--amend' substitui completamente o último commit (hash novo!). Use-o para corrigir erros de digitação na mensagem ou adicionar arquivos esquecidos. Nunca o use em commits já enviados para branches compartilhadas - ele reescreve o histórico.
Use várias opções -m: 'git commit -m "Subject" -m "Body paragraph"'. Cada -m cria um parágrafo novo. Ou simplesmente rode 'git commit' para abrir o editor.
Mantenha a linha de assunto abaixo de 50 caracteres (limite rígido de 72). Quebre o corpo em 72 caracteres. Assim a leitura fica boa no terminal, no git log e nas interfaces do GitHub/GitLab.
Use 'git commit --no-verify' ou '-n'. Isso pula os hooks pre-commit e commit-msg. Use com moderação - os hooks existem para manter a qualidade do código.
Sim, use 'git commit --allow-empty -m "message"'. Útil para disparar pipelines de CI/CD ou marcar marcos no histórico sem mudar o código.