Как откатить коммит? [дубликат]
Значит такая ситуация, мне нужно было вернуться назад на несколько коммтов ( git checkout v2.0 не создавая новую ветку), чтоб проверить что то в прошлой версии, потом я забыл про то, что откатился и сделал несколько изменений и закоммитил( git commit -m ‘commit’ ), теперь думаю как вырезать этот последний коммит?
Отслеживать
8,592 4 4 золотых знака 29 29 серебряных знаков 53 53 бронзовых знака
задан 7 авг 2017 в 18:04
11k 18 18 золотых знаков 64 64 серебряных знака 128 128 бронзовых знаков
git reset —hard HEAD~1 А вообще лучше создавайте бранчи — дёшево и практично!
7 авг 2017 в 18:06
@0andriy и что это уберет последний коммит? Просто у меня ситуация, что я нахожусь на ветке мастер, просто откатился на несколько коммитов назад, а теперь мне нужно вернуться обратно вперед, только не оставляя после себя ничего
7 авг 2017 в 18:10
git reset —hard $HASH_TO , где $HASH_TO — это хэш комита, который вам нужен в итоге. Почитайте мануал в конце концов, а?
7 авг 2017 в 18:12
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
git revert [название коммита] — откатит изменения в виде следующего коммита. Т.е., создан коммит «Mistake», при использовании revert будет создан еще один коммит «Revert mistake».
Отслеживать
8,592 4 4 золотых знака 29 29 серебряных знаков 53 53 бронзовых знака
ответ дан 7 авг 2017 в 18:35
Albert Akmukhametow Albert Akmukhametow
119 6 6 бронзовых знаков
Если вам ещё нужны изменения, выполненные в самой последней фиксации*, то восстановить её можно будет после переключения обратно на нужную ветку. Пока что нужно запомнить хэш этой фиксации командой git show —format=%H HEAD . Обозначим её вывод как $HASH .
Затем просто переключитесь обратно, к предыдущей ветке с помощью git chechout — . Если вы попали не туда, куда требовалось, укажите вашу ветку в явном виде. Кроме того, вы можете увидеть подсказку от git с хэшем фиксации, откуда вы только что ушли, с предложением создать новую ветку, на неё указывающую.
Затем примените ту самую фиксацию поверх нового состояния командой git cherry-pick $HASH . В результате этого, ваши изменения должны оказаться в нужной вам ветке.
Это же описание, но в виде сценария оболочки.
HASH=$(git show --format=%H HEAD) git checkout - git cherry-pick $HASH
Как отменить последний коммит

Допустим, вы работаете над кодом в Git и вдруг что-то пошло не по плану. Вам нужно отменить ваш последний коммит. Как это сделать? Давайте разберемся!
Отменить последний коммит можно двумя способами. В этой статье мы рассмотрим оба.
Команда git revert
Команда git revert создает коммит, который возвращает изменения, внесенные с указанным коммитом. С помощью этой команды можно отменить последний коммит:
git revert
Найти имя коммита, который нужно вернуть, можно при помощи команды git log. Первый коммит в выдаче и будет вашим последним созданным коммитом.
Вы можете скопировать его хэш (цифробуквенный идентификатор) и использовать его в команде revert.
Команда git reset
Отменить последний коммит можно также при помощи команды git reset. Но будьте осторожны: это изменит историю коммитов. Пользуйтесь этой командой пореже.
Эта команда смещает HEAD на последний коммит. По умолчанию используется опция —mixed. Все изменения после указанного коммита останутся в рабочем каталоге как неотслеживаемые.
git reset HEAD~1
Опция —soft позволяет сохранить незакоммиченные изменения (если они были) как staged.
git reset --soft HEAD~1
Если вы хотите сбросить все до последнего коммита, а также удалить все неподготовленные изменения, можно использовать опцию —hard.
git reset --hard HEAD~1
Таким образом вы вернетесь в положение до последнего коммита, но вместе с тем сотрете все изменения, не попавшие в коммит.
Что лучше использовать: reset или revert?
Используйте reset исключительно для сброса коммитов, существующих лишь локально. Эта команда меняет историю коммитов. А это может негативно сказаться на работе удаленных членов команды, которые могли основывать что-то на коммите, который вы сотрете.
Команда revert создает новый коммит, отменяющий изменения, и не перезаписывает историю коммитов. Так что, если коммит, который вы хотите вернуть, уже был запушен в общий репозиторий, лучше использовать revert.
Заключение
Мы разобрали два способа отменить последний коммит, а также разобрали, когда какой лучше использовать.
Теперь вы знаете, что делать, если вы вдруг заметите баг в вашем последнем коммите, или окажется, что изменения вовсе не должны были попасть в коммит!
Как можно откатить изменения к последнему коммиту (вернуть репозиторий Git к предыдущему коммиту)

Git имеет огромное количество инструментов по исправлению ошибок, возникающих во время работы. Для возврата репозитория к состоянию предыдущего коммита («откатить» последние изменения) или удаления коммитов, можно воспользоваться командой git-revert. Эта команда создает новый коммит (называемый обратным), отменяющий изменения, внесенные в старом коммите.
Например, если известно, что последний коммит внес в программу сбой и его нужно убрать, достаточно выполнить следующую команду
git revert HEAD
В процессе выполнения команды откроется редактор, в котором можно будет отредактировать описание нового коммита.
Проверь себя
Бесплатные тесты по HTML, CSS, JS и GIT
Если коммит, нуждающийся в откате, не последний, достаточно просто указать в команде его хэш, например:
git revert 0dd263
Если нужно обратить (сделать revert) несколько коммитов, можно указать GIT промежуток истории, например:
git revert 0dd263..HEAD
В процессе выполнения этой команды будут сделаны обратные коммиты, начиная с коммита 0dd263, не включая его и до крайнего (на который указывает HEAD). Например, если в этот промежуток попало два коммита, будут сделаны два обратных коммита, поочередно отменяющие изменения каждого из исходных. Как и в предыдущих случаях, для каждого из коммитов будет открыт редактор, в котором можно будет изменить текст коммита (commit message).
Команда git revert имеет набор опций, расширяющих ее возможности, например —no-commit или если кратко, то -n. Эта опция останавливает GIT на этапе добавления изменения в индекс, после чего автор может сделать коммит самостоятельно. Это может быть полезным в случае, если делается revert нескольких коммитов и мы хотим поместить весь фикс в один обратный коммит, а не в несколько. То есть переписав предыдущий пример следующим образом, будет создан один обратный коммит, а не 2:
git revert --no-commit 0dd263..HEAD git commit -m "revert last 2 features"
С другими опциями этой команды вы можете ознакомиться на этой страничке документации. Команда git revert — это безопасный и простой способ возврата репозитория к предыдущему состоянию. так как история не изменяется, а дополняется, что позволяет делать правки ранее опубликованных коммитов.
Git как вернуться (откатиться) к коммиту.

Выбираем нужный коммит, и в консоли (и сразу откатываемся на нем):
git checkout ID_коммита
Чтобы посмотреть, состояние проекта на определенном моменте, для этого есть команде git log. Один из способов просмотреть лог (последние 10 коммитов):
git log —oneline -10
Теперь чтобы вернуться на последний актуальный коммит:
git checkout master
Чтобы переключиться на определенный коммит, и создать отдельно ветку – набираем в консоли:
git checkout -b имя_новой_ветки ID_коммита
2. Теперь рассмотрим случай, когда возвращаться не нужно, а требуется только удалить все свои незакомиченные изменения (которые ещё не индексировались командой git add):
git stash save —keep-index
при этом появится ещё одно состояние проекта (карман).
Удалить все индексированные и неиндексированные изменения:
git stash save
Вернуть обратно:
git stash apply
Если «карман» не нужен, его можно удалить:
git stash drop
И наконец, если необходимо переключиться на предыдущий коммит, отменить все последующие и продолжить разработку с него, лучший способ – это использовать git revert.
Эта команда создает новые коммиты на каждый последующий от текущего состояния.
Синтаксис следующий:
git revert IDs_коммитов
или
git revert ID_коммита..ID_коммита
Замет нужно всё это дело подтвердить коммитом:
git commit -m ‘что и зачем’
3. Допустим запушили с помощью git push —force
чтобы только ваши изменения были в репозитории (на другие коммиты нам начхать). Крайне нежелательная команда, но что поделаешь…
Протолкнули со свистом. А что же делать с тестовым сайтом? Как на нем теперь вернуться в рабочее состояние?
Используем следующий набор команд:
git fetch —all
git reset —hard origin/master
git pull origin master
А чтобы не фиксировать изменения прав доступа:
git config core.filemode false
И глобально:
git config —global core.filemode false