GitHub - Как вернуть изменения в предыдущее состояние - PullRequest
38 голосов
/ 07 августа 2011

Я использую GitHub в качестве удаленного хранилища.

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

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

$ reset --hard 3425661dba2aadccdbab

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

Ответы [ 4 ]

60 голосов
/ 07 августа 2011

У вас есть два варианта отмены изменений:

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

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

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

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

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

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

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

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

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

3 голосов
/ 07 августа 2011

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

2 голосов
/ 07 августа 2011

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

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

2 голосов
/ 07 августа 2011

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

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

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

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

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

EDIT:

Здесь похожий вопрос:

Извлечь старый коммит и сделать его новым

...