Até agora, todas as respostas não abordam a preocupação final:
Existe um método eficiente quando existem centenas de revisões após a exclusão?
As etapas a seguir, mas para referência, vamos assumir o seguinte histórico:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : confirmar apenas após a confirmação a ser removida (limpa)
R : O commit a ser removido
B : confirmar imediatamente antes da confirmação a ser removida (base)
Devido à restrição de "centenas de revisões", estou assumindo as seguintes pré-condições:
- existe algum comprometimento embaraçoso que você deseja que nunca exista
- há ZERO confirmações subsequentes que realmente dependem dessa confirmação embaraçosa (zero conflito ao reverter)
- você não se importa em ser listado como o 'Committer' das centenas de commits intermediários ('Author' será preservado)
- você nunca compartilhou o repositório
- ou você realmente tem influência suficiente sobre todas as pessoas que já clonaram a história com esse comprometimento para convencê-las a usar sua nova história
- e você não se importa em reescrever o histórico
Este é um conjunto bastante restritivo de restrições, mas há uma resposta interessante que realmente funciona nesse caso de canto.
Aqui estão os passos:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Se realmente não houver conflitos, isso deve prosseguir sem mais interrupções. Se houver conflitos, você poderá resolvê-los e / rebase --continueou decidir apenas viver com o constrangimento erebase --abort .
Agora você deve estar em masterque não possui mais commit R nele. osave ramificação aponta para onde você estava antes, caso deseje se reconciliar.
Você decide como deseja organizar a transferência de todos para o seu novo histórico. Você precisará estar familiarizado com stash, reset --harde cherry-pick. E você pode excluir os base, remove-mee saveramos