Questão de Engenharia de Software — Git — FCC 2026
Engenharia de Software›Git
Código
fc142203
Banca
FCC
Órgão
SEFAZ SP
Ano
2026
Cargo
AFRE ( )
Uma equipe de TI de uma Secretaria da Fazenda mantém o sistema de emissão de guias de arrecadação em um repositório Git central, usando a branch main diretamente em produção. Um commit já publicado alterou o cálculo de ISS e gerou valores incorretos. A auditoria exige que o histórico da main permaneça íntegro, sem reescrita de histórico já publicado, e que a correção seja aplicada a partir do commit problemático. Considerando as recomendações usuais para desfazer mudanças em uma branch pública já compartilhada, o procedimento que está alinhado a essas exigências é, na branch main, executar
Agit reset --hard HEAD~1 e depois git push --force origin main, removendo o commit incorreto do histórico remoto.
Bgit reset --soft HEAD~1, ajustar o código de ISS, criar novo commit e finalizar com git push --force origin main.
Cgit revert <hash_do_commit_incorreto> e em seguida git push origin main, registrando novo commit que desfaz as alterações de ISS.
Dgit rebase -i HEAD~2, excluir a linha do commit incorreto no rebase interativo e depois usar git push --force-with-lease origin main.
Eo cálculo de ISS em novo commit corretivo sobre o histórico atual e executar git push origin main, sem usar comandos de reescrita de histórico.
Revelar gabarito e comentário▾
GabaritoC — git revert <hash_do_commit_incorreto> e em seguida git push origin main, registrando novo commit que desfaz as alterações de ISS.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Git: desfazendo alterações em branch pública
Gabarito: letra C. Quando um commit já foi publicado e compartilhado em uma branch pública (como a main), a recomendação é não reescrever o histórico — e sim criar um novo commit que desfaça as alterações do commit problemático, usando git revert. Isso preserva a integridade do histórico exigida pela auditoria e evita conflitos para quem já tem a versão antiga. As alternativas A, B e D reescrevem o histórico (com reset ou rebase + push --force), o que viola a exigência; a alternativa E, embora não reescreva o histórico, não desfaz o commit incorreto — apenas adiciona uma correção por cima, sem reverter o cálculo de ISS.
O Git é um sistema de controle de versão distribuído, que trata os dados como um conjunto de snapshots (imagens) do sistema de arquivos. Cada commit recebe um ID exclusivo (checksum SHA-1) e o histórico é imutável por padrão: o Git não remove dados, apenas adiciona novas versões. Essa característica é a base para entender por que reescrever um histórico já publicado é problemático.
Quando você reescreve o histórico de uma branch pública (com reset, rebase ou commit --amend), os hashes dos commits mudam. Qualquer pessoa que já tenha a versão antiga da branch (outro desenvolvedor, um servidor de CI/CD, um deploy) ficará com um histórico divergente — e o próximo git pull gerará conflitos ou exigirá push --force para sobrescrever o remoto. Em um ambiente de auditoria, isso é inaceitável: o histórico deve ser rastreável e íntegro.
O git revert resolve exatamente esse problema: ele cria um novo commit que aplica as alterações inversas ao commit especificado, sem apagar ou modificar o commit original. O histórico permanece linear e completo — o commit incorreto continua lá, mas com um commit posterior que o desfaz. Isso é a prática recomendada para branches públicas, conforme a documentação oficial do Git e as boas práticas de controle de versão.
Vamos comparar os comandos envolvidos:
Comando
O que faz
Reescreve histórico?
Uso recomendado
git reset --hard
Move o ponteiro da branch e descarta alterações
Sim
Apenas em branches locais/não publicadas
git reset --soft
Move o ponteiro, mantém alterações na staging
Sim
Apenas em branches locais/não publicadas
git revert
Cria novo commit desfazendo um commit específico
Não
Branches públicas/compartilhadas
git rebase -i
Reordena/edita commits do histórico
Sim
Apenas em branches locais/não publicadas
git push --force
Sobrescreve o histórico remoto
Sim
Evitar em branches compartilhadas
A pegadinha da banca está em confundir "desfazer" com "reescrever". O enunciado exige que o histórico permaneça íntegro — ou seja, nada de reset, rebase ou push --force. A única alternativa que atende a isso e ainda desfaz o commit incorreto é o git revert.
Desfazer alteração em branch pública
1Reescrever histórico (proibido)
git reset --hard/--soft
git rebase -i
git push --force
2Preservar histórico (recomendado)
git revert
git push simples
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
git reset --hard HEAD~1remove o commit incorreto do histórico local e git push --forcesobrescreve o histórico remoto. Isso reescreve o histórico já publicado, violando a exigência de integridade. Além disso, reset --hard descarta as alterações do commit, mas o commit continua existindo no reflog (até ser expirado) — e qualquer pessoa que já tenha a versão antiga terá conflito no próximo pull.
Alternativa B — ❌ Incorreta
git reset --soft HEAD~1move o ponteiro da branch para o commit anterior, mantendo as alterações na staging area. Depois, ao criar um novo commit, o histórico é reescrito — o commit incorreto é removido e substituído por um novo. O git push --force final sobrescreve o remoto, o que viola a integridade do histórico. A intenção de "ajustar o código" é válida, mas a forma (reescrever) é proibida para branches públicas.
Alternativa C — ✅ Correta ⟵ GABARITO
git revert <hash_do_commit_incorreto>cria um novo commit que desfaz as alterações do commit especificado, sem modificar o histórico existente. O commit original permanece no histórico, e um novo commit é adicionado com as alterações inversas. Em seguida, git push origin mainenvia o novo commit para o remoto, sem reescrever nada. Isso atende perfeitamente às exigências: histórico íntegro, correção aplicada a partir do commit problemático, e sem --force.
Alternativa D — ❌ Incorreta
git rebase -i HEAD~2abre o rebase interativo, permitindo excluir ou editar commits. Excluir a linha do commit incorreto reescreve o histórico — os commits seguintes são reaplicados com novos hashes. O git push --force-with-lease final sobrescreve o remoto, violando a integridade. O --force-with-lease é mais seguro que --force (verifica se o remoto não mudou), mas ainda assim reescreve o histórico — proibido no cenário.
Alternativa E — ❌ Incorreta
Esta alternativa não reescreve o histórico (o que é bom), mas também não desfaz o commit incorreto. Ela apenas adiciona um novo commit corretivo sobre o histórico atual, sem reverter o cálculo de ISS. O resultado é que o código fica corrigido, mas o histórico mantém o commit incorreto sem um commit de reversão explícito — o que pode confundir auditorias e dificultar o rastreamento. O git revert é a forma correta de desfazer, pois cria um commit que documenta claramente a reversão.
NÃO CAIA NESSA!
A banca explora a confusão entre "desfazer" e "reescrever". reset e rebase reescrevem o histórico (mudam os hashes dos commits) — proibidos em branches públicas. revert cria um novo commit que desfaz o anterior, preservando o histórico. Se a alternativa mencionar --force (ou --force-with-lease), desconfie: em branch compartilhada, isso é sinal de reescrita.
PEGA ESSA DICA!
Na prova, identifique a palavra-chave "histórico íntegro" ou "branch pública" — isso elimina automaticamente qualquer alternativa com reset, rebase ou push --force. A resposta correta será sempre a que usa git revert + git push simples.