Criei uma nova ramificação para mexer no código sem bagunçar a ramificação principal em que estava trabalhando. Acabou não dando resultado, então voltei a trabalhar na ramificação pai sem implementar nenhuma das alterações. Há um único commit feito na nova ramificação, mas eu o quero fora do histórico de commits!
O commit foi enviado para um repositório remoto, então há um ponteiro de origem nele. Não tenho certeza se isso tem alguma coisa a ver. Socorro!
git rebase -i <commit id>
Não fez nada por mim, apenas me levou a modificar as ramificações mais recentes. Tentei executá-lo enquanto estava na ramificação em que o commit foi feito e na ramificação pai.
# Desfazer o último commit, mas manter as alterações preparadas
git reset --soft HEAD~1
# Desfazer o último commit e desfazer os arquivos (mas manter as alterações)
git reset --mixed CABEÇA~1
# Remover completamente o último commit e descartar as alterações
git reset --hard HEAD~1
Sim – pense neles como dois ramos semi-separados; o "ponteiro de origem" representa um ramo remoto com o mesmo nome. Portanto, você precisa excluir o commit do seu ramo local e enviar a atualização para o ramo remoto correspondente (o que também atualiza seu ponteiro de "origem" local para ele).
Não acho que um rebase seja realmente útil aqui. Você não precisa reescrever nenhum commit, como seria necessário ao remover um commit do meio – isso
d9e7124
não encadeia o commit indesejado – aqueles que você está excluindo não são referenciados por nada além do ponteiro de branch, e portanto podem ser cortados do final apenas atualizando o ponteiro de branch.Então, se o branch estiver atualmente verificado e você quiser revertê-lo:
Sem nenhuma opção, as alterações desse commit voltarão a ser alterações não commitadas. Adicionar
--keep
descartará as alterações que foram commitadas, mas manterá as não commitadas como estão. Usar--hard
descartará as alterações que foram commitadas e as não commitadas, retornando todos os arquivos exatamente para o commit especificado.Por outro lado, se você estiver em um branch diferente (por exemplo, de volta ao main/master), você pode recriar o branch lateral; opcionalmente especificando um ponto de partida diferente:
De qualquer forma, a atualização precisa ser enviada à força para o servidor remoto – ou você pode enviar uma exclusão de branch se não quiser mais que ela fique no servidor.
O
136b98c
ID de confirmação permanecerá no armazenamento do seu repositório por um tempo (portanto, é possível anexá-lo novamente a uma ramificação, se necessário), mas eventualmente ele será coletado como lixo após algumas semanas.Como
136b9
há um único commit no novo branch para removê-lo enquanto mantém outros commits, você pode usar um rebase interativo para removê-lo136b9
Mudar para o ramo que contém
136b9
Iniciar uma rebase interativa
Depois que o editor for aberto
Se forem
136b9
introduzidas alterações das quais os commits posteriores dependam, o Git pode pausar o rebase devido a conflitos. Se ocorrerem conflitos, resolva-os editando os arquivos em conflito.Depois de resolver todos os conflitos
Enviar para novo branch
Se
136b9
não fizer parte do histórico do main, o main permanecerá inalterado e seus commits (por exemplo, 7D71D, d9e71, d076a, 97433, 06de3) permanecerão como estavam. No entanto, se o new-branch foi mescladomain
e136b9
já faz parte domain
histórico do , removê-lo136b9
do new-branch não afetará automaticamente o main — você precisaria modificar explicitamente o histórico do main para removê-136b9
lo. Depois de excluir esse commit, você também pode excluir o seu new-branch, se desejar.Se o commit já tiver sido criado, basta criar uma nova ramificação órfã a partir dele e fazer o commit: