Wszystkie dotychczasowe odpowiedzi nie uwzględniają problemu końcowego:
Czy istnieje skuteczna metoda, jeśli po usunięciu istnieją setki wersji?
Kroki są następujące, ale w celach informacyjnych załóżmy następującą historię:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : zatwierdzenie tuż po zatwierdzeniu do usunięcia (wyczyść)
R : Zatwierdzenie do usunięcia
B : zatwierdzenie tuż przed zatwierdzeniem do usunięcia (podstawa)
Ze względu na ograniczenie „setek wersji” zakładam następujące warunki wstępne:
- jest pewne żenujące zobowiązanie, którego nigdy nie chciałbyś istnieć
- istnieją kolejne ZERO, które faktycznie zależą od tego żenującego zatwierdzenia (zero konfliktów przy przywróceniu)
- nie obchodzi cię, że zostaniesz wymieniony jako „Committer” spośród setek interweniujących zmian („Autor” zostanie zachowany)
- nigdy nie udostępniłeś repozytorium
- lub rzeczywiście masz wystarczający wpływ na wszystkich ludzi, którzy kiedykolwiek sklonowali historię z tym zobowiązaniem, aby przekonać ich do korzystania z nowej historii
- i nie dbam o przepisywanie historii
Jest to dość restrykcyjny zestaw ograniczeń, ale istnieje interesująca odpowiedź, która faktycznie działa w tym przypadku narożnika.
Oto kroki:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Jeśli naprawdę nie ma konfliktów, powinno to przebiegać bez dalszych zakłóceń. Jeśli występują konflikty, możesz je rozwiązać i / rebase --continuelub po prostu żyć z zażenowaniem i rebase --abort.
Teraz powinno być na masterktóre nie ma już popełnić R w nim. Te savepunkty odgałęzienia do miejsca, gdzie były wcześniej, w przypadku, gdy chcesz się pogodzić.
To, jak chcesz zorganizować przeniesienie wszystkich osób do nowej historii, zależy od Ciebie. Trzeba będzie zapoznać się z stash, reset --hard, i cherry-pick. I można usunąć base, remove-meoraz saveoddziały