git commit

Snapshots básicos

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>...]
[ ] opcional| ou<arg> valor a substituir... repetível--flag opção

Opções

Clique em uma opção para expandir

Iniciante (8)

Usar a mensagem indicada como mensagem do commit. Pode ser repetido para mensagens com vários parágrafos.

RecomendadoBom para mensagens curtas; use o editor para assunto e corpo

Exemplo

git commit -m "Add login feature"

Preparar automaticamente todos os arquivos rastreados modificados e excluídos antes do commit. NÃO adiciona arquivos novos não rastreados.

Quando necessárioPula a revisão da preparação e nunca inclui arquivos novos não rastreados

Exemplo

git commit -a -m "Update all config files"

Substituir a ponta da branch atual por um commit novo. Serve para corrigir a mensagem do último commit ou adicionar arquivos esquecidos. Cria um hash de commit novo.

Quando necessárioSeguro em commits não enviados; reescreve o histórico se já foram enviados

Exemplo

git commit --amend -m "Fixed message"

Mostrar o diff das mudanças preparadas no modelo da mensagem. Ajuda a revisar o que entra no commit enquanto você escreve a mensagem.

RecomendadoMostra o diff enquanto você escreve a mensagem

Exemplo

git commit -v

Mostrar o que entraria no commit sem criar o commit. Ótimo para conferir antes.

Quando necessárioPré-visualiza o que entraria no commit, sem fazer o commit

Exemplo

git commit --dry-run

Ocultar o resumo do commit que mostra os arquivos alterados e as inserções/exclusões.

Quando necessárioSuprime o resumo do commit — principalmente para scripts

Exemplo

git commit -q -m "Silent commit"

Abrir o editor para a mensagem mesmo com -m, -F ou -C. Permite continuar editando a mensagem.

Quando necessárioAbre o editor mesmo quando -m, -F ou -C já deram uma mensagem

Exemplo

git commit -m "Initial message" -e

Usar a mensagem de commit escolhida sem abrir o editor. Muito usado com --amend para adicionar arquivos sem mudar a mensagem.

Quando necessárioReaproveita a mensagem existente, normalmente junto com --amend

Exemplo

git commit --amend --no-edit

Intermediário (10)

Ler a mensagem do commit do arquivo indicado. Use '-' para ler da entrada padrão.

Quando necessárioPega a mensagem de um arquivo ou do stdin — para scripts e mensagens longas

Exemplo

git commit -F commit-message.txt

Abrir o editor da mensagem com o conteúdo do arquivo indicado (o commit.template define isso por padrão). Deixar o modelo sem mudanças cancela o commit; não tem efeito quando -m ou -F fornecem a mensagem.

Quando necessárioParte de um modelo de mensagem de commit da equipe

Exemplo

git commit -t .gitmessage

Pegar um objeto commit existente e reusar a mensagem e as informações de autoria (incluindo a data) ao criar o commit.

Quando necessárioReaproveita a mensagem e a autoria de outro commit como estão

Exemplo

git commit -C HEAD~1

Como -C, mas abre o editor para você editar a mensagem. Reusa as informações de autoria, mas deixa mudar o texto.

Quando necessárioParte da mensagem de outro commit e deixa você editá-la

Exemplo

git commit -c HEAD~1

Preparar os caminhos indicados além do que já está preparado e depois fazer commit de tudo. A documentação oficial avisa que normalmente não é isso que você quer, a não ser para concluir um merge com conflito.

Quando necessárioPrepara os caminhos informados além do que já está preparado

Exemplo

git commit -i extra-file.js -m "Include additional file"

Fazer commit só do conteúdo da árvore de trabalho dos arquivos indicados; as outras mudanças preparadas continuam preparadas para depois. É o padrão quando caminhos são informados.

Quando necessárioFaz o commit só dos caminhos informados — já é o padrão quando caminhos são informados

Exemplo

git commit -o urgent-fix.js -m "Hotfix"

Usar a interface interativa de seleção de patch para escolher quais mudanças entram no commit. Permite fazer commit de partes de arquivos.

RecomendadoEscolher hunks e fazer o commit em um passo

Exemplo

git commit -p

Adicionar um trailer Signed-off-by no fim da mensagem do commit. Certifica que você tem direito de enviar o código (Developer Certificate of Origin).

Quando necessárioAdicione quando o projeto exigir a assinatura DCO

Exemplo

git commit -s -m "Add feature"

Desativar o trailer Signed-off-by. Cancela um --signoff anterior na linha de comando (por ex., vindo de um alias).

Quando necessárioCancela um --signoff anterior na mesma linha de comando

Exemplo

git commit --no-signoff -m "Skip signoff"

Incluir a saída do git status no modelo da mensagem mostrado no editor. Ativado por padrão; útil para anular --no-status.

Quando necessárioInclui a lista de status no modelo do editor (o padrão)

Exemplo

git commit --status

Avançado (12)

Substituir o autor do commit. Informe no formato 'Author Name <email@example.com>'.

Quando necessárioDá crédito ao trabalho de outra pessoa; para programação em dupla, prefira uma linha Co-authored-by

Exemplo

git commit --author="John Doe <john@example.com>" -m "Fix bug"

Substituir a data de autoria usada no commit. Aceita vários formatos, como ISO 8601, RFC 2822 ou datas relativas.

Quando necessárioSubstitui a data de autoria; raramente necessário

Exemplo

git commit --date="2025-01-15 10:30:00" -m "Backdated commit"

Com --amend, -C ou -c (ou ao fazer commit depois de um cherry-pick com conflito), torna você — quem faz o commit — o autor do commit resultante e renova a data de autoria.

Quando necessárioAssume a autoria ao fazer amend ou reaproveitar uma mensagem

Exemplo

git commit --amend --reset-author

Pular os hooks pre-commit e commit-msg. Com cuidado, pois esses hooks costumam garantir a qualidade do código.

Não recomendadoPula as verificações pre-commit e commit-msg — corrija o que o hook aponta

Exemplo

git commit -n -m "Quick fix (skip hooks)"

Permitir um commit sem nenhuma mudança. Útil para disparar pipelines de CI/CD ou marcar marcos.

Quando necessárioCommits sem mudanças, por ex. para disparar a CI

Exemplo

git commit --allow-empty -m "Trigger rebuild"

Permitir um commit com mensagem vazia. Em geral não é recomendado, pois deixa o histórico mais difícil de entender.

Não recomendadoMensagens vazias deixam o histórico ilegível

Exemplo

git commit --allow-empty-message -m ""

Definir como limpar a mensagem antes do commit. Modos: strip, whitespace, verbatim, scissors, default (strip se o editor abrir, senão whitespace).

Quando necessárioControla como linhas # e espaços são removidos da mensagem

Exemplo

git commit --cleanup=verbatim -m "Keep message exactly as-is"

Assinar o commit com GPG. Prova que o commit foi feito por você e não foi adulterado. Exige GPG configurado.

Quando necessárioAssine quando o seu projeto ou serviço de hospedagem verifica assinaturas

Exemplo

git commit -S -m "Signed commit"

Não assinar o commit com GPG. Anula a configuração commit.gpgSign se ela estiver como true.

Quando necessárioSubstitui commit.gpgSign para um commit

Exemplo

git commit --no-gpg-sign -m "Unsigned commit"

Criar um commit fixup para usar com git rebase --autosquash. Durante o rebase, o commit é fundido automaticamente no commit indicado.

RecomendadoJeito limpo de corrigir um commit mais antigo junto com rebase --autosquash

Exemplo

git commit --fixup=abc1234

Criar um commit squash para usar com git rebase --autosquash. Como --fixup, mas mantém as duas mensagens para combiná-las durante o rebase.

Quando necessárioComo o --fixup, mas permite combinar as mensagens

Exemplo

git commit --squash=abc1234

Adicionar um trailer (chave: valor) à mensagem do commit. Trailers comuns: Reviewed-by, Co-authored-by, Fixes etc.

Quando necessárioMetadados estruturados como Co-authored-by ou Reviewed-by

Exemplo

git commit --trailer "Reviewed-by: Jane <jane@example.com>" -m "Fix bug"

Especialista (8)

No dry-run, mostrar a saída no formato curto. Mostra o status dos arquivos de forma compacta, como git status -s. Implica --dry-run.

Quando necessárioSaída do teste a seco no formato de status curto

Exemplo

git commit --dry-run --short

No dry-run, mostrar a saída no formato longo (padrão). Mostra informações detalhadas do status dos arquivos.

Quando necessárioSaída do teste a seco no formato de status longo

Exemplo

git commit --dry-run --long

No dry-run, mostrar a saída no formato porcelain. Saída estável, boa para scripts, que não muda entre versões do Git.

Quando necessárioSaída do teste a seco legível por máquina para scripts

Exemplo

git commit --dry-run --porcelain

Mostrar a branch e as informações de rastreamento mesmo no formato curto durante o dry-run.

Quando necessárioAdiciona informações da branch à saída curta/porcelain do teste a seco

Exemplo

git commit --dry-run --short --branch

Nas saídas de status short ou porcelain, terminar as entradas com NUL em vez de quebra de linha. Útil para interpretar nomes de arquivo com caracteres especiais.

Quando necessárioSaída do teste a seco terminada em NUL para scripts

Exemplo

git commit --dry-run --porcelain -z

Não incluir a saída do git status no modelo da mensagem ao usar o editor.

Quando necessárioEsconde a lista de status no modelo do editor

Exemplo

git commit --no-status

Pular o hook post-rewrite, que o git commit só roda no amend (--amend).

Quando necessárioPula o hook post-rewrite no --amend; raramente necessário

Exemplo

git commit --amend --no-post-rewrite

Ler o pathspec de um arquivo (um por linha) em vez da linha de comando. Use '-' para ler da entrada padrão.

Quando necessárioPara scripts que fazem commit de muitos caminhos

Exemplo

git commit --pathspec-from-file=files.txt -m "Commit listed files"

Escolhendo a opção certa

Opções de mensagem

Jeitos diferentes de informar ou editar a mensagem do commit

ComandoOrigemAbre o editorCaso de uso
git commit -m "msg"Na linha✗Commits rápidos com mensagens curtas
git commit -F fileArquivo✗Mensagem já escrita em um arquivo
git commit -t fileModelo✓Começar com um modelo no editor
git commit -eEditor✓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

ComandoModoRemove comentáriosRemove espaçosIdeal para
--cleanup=stripstrip✓✓A maioria dos commits
--cleanup=whitespaceEspaços✗✓Manter comentários #
--cleanup=verbatimLiteral✗✗Preservar a mensagem exatamente
--cleanup=scissorsTesouraSó abaixo da linha da tesoura✓Manter linhas # ao usar o editor

Autor e data

Mudar quem fez o commit e quando

ComandoSubstituiFormatoUso típico
--author="Name <email>"AutorNome <email>Fazer commit em nome de outra pessoa
--date="date"Data de autoriaISO 8601 / relativaColocar datas retroativas em commits
--reset-authorAmbosUsuário/hora atuaisAssumir a autoria de um patch aplicado

Amend e correção do histórico

Opções para modificar commits existentes

ComandoCriaModifica o HEADUsar com
git commit --amendSubstituiçã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

ComandoPrepara antesCommitsDiretório de trabalho
git commit✗Só o preparadoSem mudanças
git commit -aArquivos rastreadosTodos os rastreadosSem mudanças
git commit -i <file>IndicadosPreparado + arquivoSem mudanças
git commit -o <file>Só os indicadosSó o arquivoOutros preparados ficam de fora
git commit -pInterativoTrechos escolhidosSem mudanças

Assinatura GPG

Assinar commits criptograficamente para verificação

ComandoAçãoChave usadaQuando usar
git commit -SAssinarChave GPG padrãoProvar a autenticidade do commit
git commit -S<keyid>AssinarChave específicaUsar outra chave de assinatura
git commit --no-gpg-signNão assinarNenhumAnular commit.gpgSign=true

Controle de hooks

Pular ou controlar os hooks pre-commit e post-commit

ComandoPulaNível de riscoQuando usar
git commit --no-verifypre-commit + commit-msgMédioCorreção urgente, arrumar os hooks depois
git commit --no-post-rewritepost-rewriteBaixoPular o processamento lento pós-amend

Dry-run e formato de saída

Ver o que entraria no commit sem fazer o commit

ComandoFormatoInterpretávelMostra
--dry-runLongo (padrão)✗Status completo com dicas
--dry-run --shortCurto✓Códigos de status compactos
--dry-run --porcelainPorcelain✓Formato estável para scripts
--dry-run --branchCom a branch✓Adiciona informações de rastreamento ao formato curto
--dry-run -zSeparada por NUL✓Seguro para nomes de arquivo especiais

Status mostrado no editor

Controlar o que aparece no editor ao escrever a mensagem

ComandoNo editorEfeito
git commit --statusStatus como comentáriosVer os arquivos do commit (padrão)
git commit --no-statusSem lista de arquivosEditor mais limpo, menos distração
git commit -vDiff completoRevisar as mudanças exatas enquanto escreve
git commit -qEditor normalOcultar o resumo depois do commit

Commits especiais

Criar commits em situações incomuns

ComandoPermiteCria commitCaso de uso
--allow-emptyNenhuma mudança✓Gatilhos de CI, marcadores de branch
--allow-empty-messageSem mensagem✓Scripts automatizados (não recomendado)
--trailer "Key: value"Metadados✓Co-authored-by, Fixes, Reviewed-by

Exemplos de fluxos de trabalho

1
git add .

Preparar as suas mudanças

2
git commit -m "Fix typo in README"

Fazer commit com uma mensagem curta

1
git add -A

Preparar todas as mudanças

2
git commit

Abre o editor para uma mensagem de várias linhas

3
(Write: subject line, blank line, detailed body)

Seguir a regra 50/72 de formatação

1
git add forgotten-file.js

Preparar o arquivo esquecido

2
git commit --amend --no-edit

Adicionar ao último commit sem mudar a mensagem

1
git commit --amend -m "Corrected message"

Substituir o último commit com uma mensagem nova

1
git commit -a -m "Update config files"

Preparar automaticamente os arquivos rastreados modificados/excluídos e fazer commit

1
git add .

Preparar as mudanças

2
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 = vim
iEntrar no modo de inserção (começar a digitar)
EscSair do modo de inserção
:wqSalvar e sair (conclui o commit)
:q!Sair sem salvar (cancela o commit)
ddApagar a linha atual
uDesfazer a última mudança

Nano

core.editor = nano
Ctrl+OSalvar o arquivo (write out)
Ctrl+XSair (pergunta se quer salvar, se houver mudanças)
Ctrl+KRecortar a linha atual
Ctrl+UColar o texto recortado
Ctrl+WBuscar no arquivo

VS Code

core.editor = "code --wait"
Ctrl+SSalvar o arquivo
Ctrl+WFechar a aba (conclui o commit)
Ctrl+ZDesfazer
Close without savingCancelar o commit

Modo patch (-p)

git commit -p
yPreparar este trecho
nNão preparar este trecho
qSair; não preparar os trechos restantes
aPreparar este e todos os trechos restantes
dNão preparar este nem os trechos restantes
sDividir o trecho em trechos menores
eEditar o trecho à mão
?Mostrar a ajuda

Soluçã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-lease

Your 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 main

Dicas 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

A:

'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'.

A:

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.

A:

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.

A:

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).

A:

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.

A:

'--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.

A:

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.

A:

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.

A:

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.

A:

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.