GIT отменить коммит, который не является самым последним, rebase all commits since
Раньше я совершил некоторый код, который в то время казался хорошей идеей, но на самом деле все ухудшалось. Я хотел бы удалить изменения из истории, поскольку это не помогает, и переустанавливать все коммиты с тех пор - они должны все сливаться без проблем.
Я попытался создать новую ветку (называемую newMaster
) непосредственно перед неудачной фиксацией (с gitx), проверкой и запуском:
git rebase -i master
Какой AFAICS должен был дать мне список коммитов на master и возможность объединить или не объединить их, но вместо этого он сказал noop и быстро перенаправил newMaster равным master.
Какой самый простой способ сделать то, что мне нужно?
Ответы
Ответ 1
git rebase -i
- это правильная команда, но вы хотите сделать это из ветки с последними изменениями и передать в ревизию, которая является "базой" операции переадресации (ревизия непосредственно перед неудачной фиксацией). Итак, если вы создали ветвь last-good-commit
, которая указывает на последнюю хорошую фиксацию, вы хотели бы запустить следующую команду master
:
git rebase -i last-good-commit
Ответ 2
Самый простой способ сделать то, что вы хотите, - это приостановить (или переустановить) ветку, которую вы хотите отредактировать, и запустить что-то вроде этого.
git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit>
Это приведет к переустановке всего, поскольку плохое совершение на плохой фиксации родителя, эффективно удаляя плохую комиссию из вашей текущей истории ветвей. Конечно, вам нужно будет разрешить любые конфликты, если они произойдут.
Ответ 3
Используя rebase
, я не смог нажать изменения на пульте дистанционного управления, и моя rebase была отменена при каждом нажатии.
Мне удалось вернуть точную фиксацию (а не последнюю), просто:
git revert <sha-of-bad-commit>
И тогда я также смог нажать на удаленный