Sobes.tech
Middle

Como fazer a sobrescrição de alterações na branch principal (main branch)?

sobes.tech IA

Resposta da IA

Utilize git revert ou git rebase (em modo "interativo", ou git rebase --onto para cenários mais complexos) seguido de git push -f.

git revert cria um novo commit que desfaz as alterações dos commits especificados. É uma opção mais segura, pois mantém o histórico.

# Desfazer o último commit
git revert HEAD
# Desfazer um commit específico pelo seu hash
git revert <commit-hash>
# Desfazer um intervalo de commits (excluindo o último)
git revert <hash-inicial>..<hash-final>
# Desfazer um intervalo de commits (incluindo ambos)
git revert -n <hash-inicial>^..<hash-final>
# Desfazer alterações aplicando-as numa única porção sem criar commits separados para cada alteração
git revert -n <commit-hash-ou-intervalo>
# Aplicar o commit criado
git commit -m "Revert changes"

git rebase permite reescrever o histórico de commits. Pode ser usado para eliminar, fundir ou alterar a ordem dos commits. Requer precaução, especialmente em branches partilhadas.

# Iniciar rebase interativo para os últimos N commits
git rebase -i HEAD~N
# No editor que se abre, alterar 'pick' para 'drop' junto aos commits a eliminar.
# Guardar e fechar o arquivo.

# Cenário com rebase --onto: mover os commits A, B, C da branch feature para master,
# ignorando o commit D que estava na feature.
# Branch atual: feature
# X -- Y -- Z -- D -- A -- B -- C (feature)
#             /
#            W (master)
# Objetivo: X -- Y -- Z -- W -- A -- B -- C (master)
git rebase --onto master D feature
# Onde:
# master - branch destino para onde movemos
# D - commit até o qual excluímos do movimento na branch de origem
# feature - branch de origem de onde pegamos os commits para mover

Após aplicar git revert ou git rebase na branch principal, será necessário forçar o envio (git push -f ou git push --force-with-lease), pois o histórico local divergiu do remoto.

# Envio forçado após rebase
git push -f origin main
# Envio forçado mais seguro
git push --force-with-lease origin main

Importante: Sobrescrever o histórico na branch comum (main) é altamente desaconselhado, pois pode interromper o trabalho de outros desenvolvedores que já sincronizaram com a versão anterior do histórico. É preferível usar git revert. git rebase na branch principal deve ser usado apenas em casos excepcionais e com plena certeza das consequências, geralmente após acordo com toda a equipa.