Подтвердить что ты не робот

GitHub - Как вернуть изменения в предыдущее состояние

Я использую GitHub как мой удаленный репозиторий.

Я уже нажал 5 коммитов на сервер и хочу вернуться в состояние до того, как они совершутся.

Если хеш фиксации 3425661dba2aadccdbab, как я могу вернуть весь локальный/удаленный ответ на этот коммит? Я попробовал

$ reset --hard 3425661dba2aadccdbab

но это только сбросило мою рабочую головку к этой ветке и требует, чтобы я снова сделал git pull. Я пробовал проверку, но это заставило меня приземлиться в ветке "отсоединенной головы".

4b9b3361

Ответ 1

В основном у вас есть два варианта возврата изменений:

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

Первая опция может быть достигнута с помощью git revert

git -revert - Отменить некоторые существующие коммиты

Учитывая один или несколько существующих коммитов, верните изменения, которые вносят связанные исправления, и запишите некоторые новые коммиты, которые записывают их.

Примером может быть git revert -n HEAD~5..HEAD. Эта команда создает 5 новых коммитов, каждая из которых отменяет одну из последних 5 коммитов текущей отмеченной ветки.

Второй вариант - это фактически удалить коммиты. Обратите внимание, что это изменяет историю в репозитории. Поэтому любой, кто уже потянул за изменения, вероятно, будет довольно удивлен, и все может стать беспорядочным. Тем не менее, вы можете сделать

git reset --hard HEAD~5
git push --force

Первая команда уничтожит любые незафиксированные изменения в текущей рабочей копии. и reset ваш локальный репозиторий состояния текущего HEAD-5 совершает. Вторая команда принудительно нажимает на удаленный по умолчанию (т.е. GitHub). Там любые изменения, отклоняющиеся от текущего локального репозитория, перезаписываются.

Замечание о предупреждении снова: если вы действительно не знаете, что делаете, не используйте этот параметр, так как это может привести к потере данных для вас или других лиц, если это не сделано правильно. Используйте первый вариант, поскольку он будет прозрачно удалять изменения, но без неприятных побочных эффектов перезаписи истории.

Ответ 2

Сделайте git push -f. Не очень хорошая идея, если другие люди используют один и тот же репо.

Ответ 3

Сделайте проверку git, а затем передайте ее ветке, которую хотите. Это сделает новый коммит со старым кодом (так что у вас будет 6 коммитов).

git checkout HEAD~3, где 3 - количество возвратов, которые вы хотите вернуть.

Еще лучше, вы можете проверить один файл в текущем HEAD:

git checkout 3425661dba2aadccdbab:path/to/file/from/base

Это уменьшит вероятность того, что другие люди будут сердиться на то, что вы вытащили пословичный ковер из-под ног.

EDIT:

Здесь есть аналогичный вопрос:

Оформить покупку старого фиксатора и сделать новый коммит

Ответ 4

Вы можете сделать git revert <commit> ко всем фиксациям, которые были сделаны после вашего состояния. (В обратном порядке, чтобы избежать конфликтов).

Это чистый способ, если другие люди используют репо, но немного усердно. (Вы можете автоматизировать, хотя...?)