Ответы:
Вы можете использовать git revert <commit>…для всех n коммитов, а затем нажимать как обычно, сохраняя историю без изменений.
Или можно "откатиться" с помощью git reset --hard HEAD~n. Если вы продвигаете общедоступный или общий репозиторий, вы можете отклониться и нарушить работу других на основе вашей исходной ветки. Git предотвратит это, но вы можете использовать git push -fдля принудительного обновления.
revertприведет к тому, что ваши функциональные ветки будут считаться "уже объединенными". Это потому , что эти отрасли будут фактически объединены. Но изменения были отменены. Решение: выберите вишню или отмените фиксацию отката .
reset --hardтакже приводит к тому, что ветки функций считаются уже объединенными? Я предполагаю, что это не так (где revertбы).
elmarco прав ... его предложение лучше всего подходит для общих / публичных репозиториев (или, по крайней мере, публичных веток). Если он не был опубликован (или вы хотите помешать другим), вы также можете нажать на конкретную ссылку:
git push origin old_master:master
Или, если есть конкретный коммит SHA1 (скажем, 1e4f99e в сокращенной форме), вы хотите вернуться к:
git push origin 1e4f99e:master
К счастью, я смог использовать решение Пэта Нотца, которое полностью удалило нежелательную фиксацию. Однако изначально я получил ошибку
error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*
Но добавление -fопции force ( ) перезаписывает эту ошибку
git push -f origin 52e36b294e:master
Если у вас есть прямой доступ к удаленному репо, вы всегда можете использовать:
git reset --soft <sha1>
Это работает, поскольку нет попытки изменить несуществующий рабочий каталог. Подробнее см. Исходный ответ:
Как я могу отменить последний коммит в репозитории git bare?
git reset --hard [sha1]где sha1 - идентификатор хэша фиксации.