Усі відповіді на даний момент не стосуються неспокійної проблеми:
Чи є ефективний метод, коли після видалення є сотні версій?
Наступні кроки, але для довідки припустимо таку історію:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
С : вчинити лише після виконання зобов'язання, яке потрібно видалити (очистити)
R : Комісія, яку потрібно зняти
B : фіксація, що безпосередньо передує видаленню (база)
Через обмеження "сотні змін" я припускаю такі умови:
- є деякі незручні вчинки, яких ви хочете, щоб ніколи не існувало
- є наступні зобов’язання ZERO, які фактично залежать від цього невтішного вчинення (нульові конфлікти при поверненні)
- тобі не байдуже, що ти будеш вказаний як "Комітер" із сотень втручаються комісій ("Автор" буде збережено)
- ви ніколи не ділилися сховищем
- або ти насправді маєш достатній вплив на всіх людей, котрі коли-небудь клонували історію, що вчинили її, щоб переконати їх використати твою нову історію
- і ви не дбаєте про переписування історії
Це досить обмежуючий набір обмежень, але є цікава відповідь, яка насправді працює в цьому кутовому випадку.
Ось такі кроки:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Якщо справді немає конфліктів, то це має продовжуватися без подальших перерв. Якщо виникають конфлікти, ви можете їх вирішити та rebase --continue
або вирішити просто жити зі збентеженням і rebase --abort
.
Тепер ви повинні бути на master
тому, що більше не має R в ньому. У save
точках розгалуження, де ви були раніше, в разі , якщо ви хочете поєднати.
Як ви хочете домовитись про перенесення всіх інших до вашої нової історії, залежить від вас. Вам потрібно буде ознайомитися з stash
, reset --hard
і cherry-pick
. І ви можете видалити base
, remove-me
і save
гілки