Tutte le risposte finora non affrontano il problema finale:
Esiste un metodo efficiente quando ci sono centinaia di revisioni dopo quella da eliminare?
Seguono i passaggi, ma per riferimento, supponiamo che la seguente cronologia:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : commit appena dopo il commit da rimuovere (clean)
R : Il commit da rimuovere
B : commit appena precedente il commit da rimuovere (base)
A causa del vincolo "centinaia di revisioni", presumo le seguenti condizioni preliminari:
- c'è un impegno imbarazzante che vorresti non esistesse mai
- ci sono ZERO commit successivi che dipendono effettivamente da quel commit imbarazzante (zero conflitti al ripristino)
- non ti interessa che verrai elencato come "Committer" delle centinaia di commit intermedi ("Autore" verrà preservato)
- non hai mai condiviso il repository
- o hai effettivamente abbastanza influenza su tutte le persone che hanno mai clonato la storia con quella commessa in essa per convincerli ad usare la tua nuova storia
- e non si cura circa riscrivere la storia
Questo è un insieme piuttosto restrittivo di vincoli, ma c'è una risposta interessante che funziona davvero in questo caso d'angolo.
Ecco i passaggi:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Se non ci sono veramente conflitti, questo dovrebbe procedere senza ulteriori interruzioni. Se ci sono conflitti, puoi risolverli e rebase --continue
decidere di convivere con l'imbarazzo e rebase --abort
.
Ora dovresti essere attivo master
che non ha più commesso R in esso. Il save
ramo indica dove eri prima, nel caso in cui desideri riconciliarti.
Il modo in cui desideri organizzare il trasferimento di tutti gli altri nella tua nuova cronologia dipende da te. Avrete bisogno di essere a conoscenza di stash
, reset --hard
e cherry-pick
. E si può eliminare i base
, remove-me
e save
filiali