Все ответы до сих пор не относятся к последним проблемам:
Есть ли эффективный метод, когда после удаления нужно сотни ревизий?
Далее следуют шаги, но для справки, давайте предположим следующую историю:
[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ветви