Откат удаленного репозитория Git

110

У меня есть удаленный репозиторий Git, и мне нужно откатить последние nкоммиты в холодное забвение.

Джейк
источник

Ответы:

135

Вы можете использовать git revert <commit>…для всех n коммитов, а затем нажимать как обычно, сохраняя историю без изменений.

Или можно "откатиться" с помощью git reset --hard HEAD~n. Если вы продвигаете общедоступный или общий репозиторий, вы можете отклониться и нарушить работу других на основе вашей исходной ветки. Git предотвратит это, но вы можете использовать git push -fдля принудительного обновления.

Эльмарко
источник
5
Вы можете выполнить откат к определенной фиксации, используя: git reset --hard [sha1]где sha1 - идентификатор хэша фиксации.
pisaruk
7
Вы не можете использовать get reset --hard в удаленном репозитории, так как там нет рабочего каталога. В исходном вопросе только говорится, что есть удаленное репо, нет упоминания о локальном репо.
Hazok
2
просто примечание, git push -f принудительно подтолкнет все локальные ветки к своим
пультам
Имейте в виду, что использование revertприведет к тому, что ваши функциональные ветки будут считаться "уже объединенными". Это потому , что эти отрасли будут фактически объединены. Но изменения были отменены. Решение: выберите вишню или отмените фиксацию отката .
Бенедикт
@Benedikt reset --hardтакже приводит к тому, что ветки функций считаются уже объединенными? Я предполагаю, что это не так (где revertбы).
Маркус Леон
37

elmarco прав ... его предложение лучше всего подходит для общих / публичных репозиториев (или, по крайней мере, публичных веток). Если он не был опубликован (или вы хотите помешать другим), вы также можете нажать на конкретную ссылку:

git push origin old_master:master

Или, если есть конкретный коммит SHA1 (скажем, 1e4f99e в сокращенной форме), вы хотите вернуться к:

git push origin 1e4f99e:master
Пэт Нотц
источник
9

К счастью, я смог использовать решение Пэта Нотца, которое полностью удалило нежелательную фиксацию. Однако изначально я получил ошибку

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
Гедублея
источник
3

Если у вас есть прямой доступ к удаленному репо, вы всегда можете использовать:

git reset --soft <sha1>

Это работает, поскольку нет попытки изменить несуществующий рабочий каталог. Подробнее см. Исходный ответ:

Как я могу отменить последний коммит в репозитории git bare?

Hazok
источник
2
Зачем это --softвообще было нужно? Вероятно, вы могли бы сделать то же самое с простым git reset, без флага режима.