Pular para o conteúdo principal

Questão de Engenharia de Software — Git — FCC 2026

Engenharia de SoftwareGit
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

  1. Agit reset --hard HEAD~1 e depois git push --force origin main, removendo o commit incorreto do histórico remoto.
  2. Bgit reset --soft HEAD~1, ajustar o código de ISS, criar novo commit e finalizar com git push --force origin main.
  3. Cgit revert <hash_do_commit_incorreto> e em seguida git push origin main, registrando novo commit que desfaz as alterações de ISS.
  4. Dgit rebase -i HEAD~2, excluir a linha do commit incorreto no rebase interativo e depois usar git push --force-with-lease origin main.
  5. 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~1 remove o commit incorreto do histórico local e git push --force sobrescreve 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~1 move 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 main envia 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~2 abre 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.

Gabarito: letra C

Link permanente: /questoes/fc142203